MCP: Low Level Tools with Javascript SDK

Install:

pnpm add @modelcontextprotocol/sdk

Create server.js

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
    ListToolsRequestSchema,
    CallToolRequestSchema
} from "@modelcontextprotocol/sdk/types.js";

// Create an MCP server
const server = new Server(
    {
        name: "demo-server",
        version: "1.0.0"
    },
    {
        capabilities: {
            tools: {}
    }
});

tools/list

// tools/list
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "calculate_sum",
        description: "Calculates the sum of two numbers.",
        inputSchema: {
          type: "object",
          properties: {
            num1: { type: "number" },
            num2: { type: "number" },
          },
          required: ["num1", "num2"],
        },
      },
      // Add more tool definitions as needed
    ],
  };
});

tools/call (part 1)

// tools/call
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "calculate_sum") {
    const { num1, num2 } = request.params.arguments;
    const sum = num1 + num2;
    return {
        abc: "def"
    };
  }
});

// start the server
const transport = new StdioServerTransport();
await server.connect(transport);

try it out

node client.js                                                             
{
    "content": [],
    "abc": "def"
}

try it out with cli:

echo '{"jsonrpc":"2.0","method":"tools/call", "params": {"name":"calculate_sum", "arguments": {"num1": 1, "num2": 2}},"id":1}' | node server.js | jq
{
  "result": {
    "abc": "def"
  },
  "jsonrpc": "2.0",
  "id": 1
}

tools/call (part 2)

// tools/call
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "calculate_sum") {
    const { num1, num2 } = request.params.arguments;
    const sum = num1 + num2;
    return {
        content: [
            {
                type: "text",
                text: "hello"
            },
            {
                type: "resource_link",
                uri: "hello://world",
                name: "hello-world"
            },
            {
                type: "resource",
                resource: {
                    uri: "hello://world",
                    text: "hello world",
                    mimeType: "plain/text"
                }
            },

        ]
    };
  }
});

// start the server
const transport = new StdioServerTransport();
await server.connect(transport);

try it out

node client.js                                                             
{
    "content": [
        {
            "type": "text",
            "text": "hello"
        },
        {
            "name": "hello-world",
            "uri": "hello://world",
            "type": "resource_link"
        },
        {
            "type": "resource",
            "resource": {
                "uri": "hello://world",
                "mimeType": "plain/text",
                "text": "hello world"
            }
        }
    ]
}

try it out with cli:

echo '{"jsonrpc":"2.0","method":"tools/call", "params": {"name":"calculate_sum", "arguments": {"num1": 1, "num2": 2}},"id":1}' | node server.js | jq
{
  "result": {
    "content": [
      {
        "type": "text",
        "text": "hello"
      },
      {
        "type": "resource_link",
        "uri": "hello://world",
        "name": "hello-world"
      },
      {
        "type": "resource",
        "resource": {
          "uri": "hello://world",
          "text": "hello world",
          "mimeType": "plain/text"
        }
      }
    ]
  },
  "jsonrpc": "2.0",
  "id": 1
}

References:


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *