Expose any LangChain tool as an MCP server
Single tool 'list_registered_tools' has a reasonable description (56 chars, within 10-1024 range) but critically lacks an input schema. The tool accepts no parameters (empty {}), yet the schema is not formally declared in the code. Tool naming follows verb_noun convention ('list_registered_tools'), which is good. However, the output schema is undocumented, callers cannot know what fields to expect from the returned list of dicts. The server is a bridge/wrapper with minimal intrinsic tools; it delegates to LangChain tools registered at runtime. This design means tool definitions are generated dynamically via _bind_tool(), making static schema validation impossible. The _invoke() function wraps LangChain tools but does not expose input schemas to the MCP protocol, schemas are inferred from LangChain's args_schema but not formally registered with FastMCP.
List the LangChain tools currently bridged into MCP.
No input schema declared for list_registered_tools. Tool accepts {} but schema is not formally registered with FastMCP.
Output schema undocumented. list_registered_tools returns list[dict[str, Any]] but callers cannot know the structure of each dict (name, description, schema fields).
Dynamically registered LangChain tools lack static schema visibility. _bind_tool() wraps tools and registers them via mcp.tool() decorator, but input schemas from LangChain's args_schema are not exposed to the MCP protocol layer. Agents cannot see parameter constraints before calling.
No parameter descriptions for dynamically registered tools. When _bind_tool() wraps a LangChain tool, it copies the tool's description but does not extract or expose parameter-level documentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | 2026-07-28+ | v2 |
Error handling lacks recovery guidance. _invoke() catches broad exceptions and raises RuntimeError with a generic message.