Skip to content

add llamaindex-mcp adapter #50

@suyuan

Description

@suyuan

from typing import Callable

import mcp
from llama_index.core.tools import FunctionTool, ToolMetadata
from mcpadapt.core import ToolAdapter
from mcpadapt.utils import modeling

class LlamaIndexAdapter(ToolAdapter):

def _create_tool_fn(self, func: Callable[[dict | None], mcp.types.CallToolResult]) -> Callable:
    async def tool_fn(**kwargs):
        return func(kwargs)

    return tool_fn

def adapt(self,
          func: Callable[[dict | None], mcp.types.CallToolResult],
          mcp_tool: mcp.types.Tool
          ) -> FunctionTool:
    """
            Adapt a MCP tool to a LlamaIndex MCP tool.

            Args:
                func: The function to adapt.
                mcp_tool: The MCP tool to adapt.

            Returns:
                A LlamaIndex MCP tool.
   """

    fn = self._create_tool_fn(func)
    model_schema = modeling.create_model_from_json_schema(
        mcp_tool.inputSchema, model_name=f"{mcp_tool.name}_Schema"
    )
    metadata = ToolMetadata(
        name=mcp_tool.name,
        description=mcp_tool.description,
        fn_schema=model_schema,
    )
    return FunctionTool.from_defaults(fn=fn, tool_metadata=metadata)

def async_adapt(self,
                func: Callable[[dict | None], mcp.types.CallToolResult],
                mcp_tool: mcp.types.Tool
                ) -> FunctionTool:
    fn = self._create_tool_fn(func)
    model_schema = modeling.create_model_from_json_schema(
        mcp_tool.inputSchema, model_name=f"{mcp_tool.name}_Schema"
    )
    metadata = ToolMetadata(
        name=mcp_tool.name,
        description=mcp_tool.description,
        fn_schema=model_schema,
    )

    return FunctionTool.from_defaults(fn=fn, tool_metadata=metadata)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions