# Using the MCP SDK

## Overview

The MCP SDK wrapper provides low-level access to MCP features. It allows an MCP server built using the [official MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) to be deployed as a Function.

![Choosing MCP SDK](/assets/docs/gram/img/functions/npm_mcp-framework.png)

## Basic usage

To deploy an existing MCP server or a new MCP server as a Function using the MCP TypeScript SDK, start with a file that exports an instance of `McpServer`.

```typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";

export const server = new McpServer({
  name: "demo-server",
  version: "1.0.0",
});

server.registerTool(
  "add",
  {
    title: "Addition Tool",
    description: "Add two numbers",
    inputSchema: { a: z.number(), b: z.number() },
  },
  async ({ a, b }) => {
    const output = { result: a + b };
    return {
      content: [{ type: "text", text: JSON.stringify(output) }],
    };
  },
);
```

A simple `gram.ts` file then wraps that server so it can be deployed as a Function.

```typescript filename="gram.ts"
import { withGram } from "@gram-ai/functions/mcp";
import { server } from "./mcp.ts";

export default withGram(server);
```

## Resources

MCP resources can also be deployed via Functions when using the MCP SDK wrapper.

```typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";

export const server = new McpServer({
  name: "demo-server",
  version: "1.0.0",
});

server.registerResource(
  "a-cool-photo",
  "resources://a-cool-photo",
  {
    mimeType: "image/jpg",
    description: "This photo is really something",
    title: "A Cool Photo",
  },
  async (uri) => {
    let res = await fetch("https://picsum.photos/200/300.jpg");
    return {
      contents: [
        {
          uri: uri.href,
          blob: Buffer.from(await res.arrayBuffer()).toString("base64"),
        },
      ],
    };
  },
);
```

After running `push`, open the MCP server from **MCP Gateway > MCP** and select the pushed resource on the server's **Resources** tab to add it to the server.
![Adding a Resource](/assets/docs/gram/img/functions/adding-resources.png)

## Environment variables

Specify credentials or environment variable values that need to be available in the tool runner environment. These can be provided either via stored environments or via MCP headers set by the end user.

```typescript filename="gram.ts"
import { withGram } from "@gram-ai/functions/mcp";
import { server } from "./mcp.ts";

export default withGram(server, {
  variables: {
    API_KEY: { description: "API key for authentication" },
  },
});
```

## Next steps

- [Build and deploy](/docs/ai-control-plane/mcp-gateway/building-servers/functions/build-deploy) Functions.
