1. Conduid
  2. AI
  3. Fastmcp Ts
MCP server · AI

Fastmcp Ts

The official FastMCP TypeScript library for building MCP servers, clients, and apps 🏎️ 🏎️ 🏎️

47Fair

Scored 3 hours ago · breakdown

About Fastmcp Ts

Fastmcp Ts is an MCP server published by PrefectHQ in the AI category: the official FastMCP TypeScript library for building MCP servers, clients, and apps 🏎️ 🏎️ 🏎️.

The repository has 76 stars and 8 forks, with the last commit yesterday. Recent commit activity is the strongest signal that reported issues will get attention.

Install

Claude Code
claude mcp add fastmcp-ts-fd15 -- npx -y @prefecthq/fastmcp-ts
npx
npx -y @prefecthq/fastmcp-ts

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about Fastmcp Ts

Powered by Claude · Grounded in docs

I know everything about Fastmcp Ts. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 1 hours ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • !License declaredNo license file. Legally you have no right to use it in a product.
  • ✓Tests presentA test suite exists in the repository.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • !No dynamic code executionSource scan found eval or shell execution. Review how tool inputs reach it before granting credentials.

1 check has not been run yet.

Releases

v1.7.3v1.7.3 · 1 Oct 2026Patch Changes 1c26cc3: Update bundled dependencies. The published CLI inlines its dependency tree, so these bumps change the shipped artifact: @hono/node-server 1.19.14 -> 1.19.17 (#108) ip-address 10.4.0 -> 10.7.2 (#106) Also bumps undici…
v1.7.2v1.7.2 · 11 Sep 2026Patch Changes ca462e8: Update bundled dependencies. The published CLI inlines its dependency tree, so these bumps change the shipped artifact: hono 4.13.0 -> 4.13.7 (#102) qs 6.15.2 -> 6.16.0 (#99) Also bumps vitest 4.1.8 -> 4.1.11 (#103),…
v1.7.1v1.7.1 · 31 Aug 2026Patch Changes 0d9c5c7: Validate URL string transport inputs against http/https schemes. A string passed to `Client` (or a `url` entry in an `mcpServers` config) that is not a valid `http:` or `https:` URL now fails fast with a clear error…
v1.7.0v1.7.0 · 31 Aug 2026Minor Changes 6342119: Add configurable CORS for the HTTP listener via `http.cors` — restrict origins (string, list, or predicate), enable credentialed requests, extend the allowed/exposed header lists, replace the methods list, set a…
v1.6.0v1.6.0 · 19 Aug 2026Minor Changes 7e37ebc: Allow embedded applications to customize the MCP client identity with `ClientOptions.clientInfo` and `MultiServerOptions.clientInfo`. The default identity now reports the installed FastMCP package version instead of…

README

fastmcp-ts

The TypeScript framework for building Model Context Protocol servers, clients, and apps. The official TypeScript counterpart to FastMCP for Python - built and maintained with 💙 by the same team at Prefect.

Built on version 2 of the official MCP TypeScript SDK — the scoped @modelcontextprotocol/server and @modelcontextprotocol/client packages. FastMCP handles the protocol plumbing so you can focus on what your server actually does.

FastMCP 1.0 speaks both MCP protocol generations: the 2025 legacy era and the 2026-07-28 modern era. A server serves both at once, and a client negotiates one. The client negotiates automatically by default: it probes once at connect, uses the modern era when the server offers it, and falls back to legacy otherwise, so upgrading from 0.x keeps your existing code running against servers of either generation. Pass versionNegotiation: { mode: 'legacy' } to opt out of the probe. The migration guide covers the upgrade path.

Installation

npm install @prefecthq/fastmcp-ts

Servers

Turn TypeScript functions into MCP tools, resources, and prompts. Input schemas are inferred automatically from any Standard Schema-compatible library: Zod, Valibot, ArkType, and others.

import { FastMCP } from '@prefecthq/fastmcp-ts/server'
import { z } from 'zod'

const server = new FastMCP({ name: 'my-server', version: '1.0.0' })

server.tool(
  {
    name: 'add',
    description: 'Add two numbers',
    input: z.object({ a: z.number(), b: z.number() }),
  },
  ({ a, b }) => a + b
)

server.resource(
  { uri: 'config://settings', description: 'App configuration' },
  () => JSON.stringify({ theme: 'dark', lang: 'en' })
)

server.resource(
  { uri: 'user://{id}', description: 'User by ID' },
  ({ id }) => `User #${id}`
)

server.prompt(
  {
    name: 'review_code',
    description: 'Review code for quality and correctness',
    arguments: [
      { name: 'code', required: true },
      { name: 'language', required: false },
    ],
  },
  ({ code, language }) =>
    `Review this ${language ?? 'code'} for quality and correctness:\n\n${code}`
)

await server.run()                              // stdio (default)
// await server.run({ transport: 'http', port: 3000 })

Save this file as server.ts. Installing @prefecthq/fastmcp-ts also installs the fastmcp CLI. Use it to inspect the server and call a tool, with no build step:

npx fastmcp inspect --file server.ts
npx fastmcp call add --file server.ts a=1 b=2

Context

Handlers access logging, progress, LLM sampling, user elicitation, and per-session state through an ambient context with no prop-drilling.

import { FastMCP } from '@prefecthq/fastmcp-ts/server'
import { z } from 'zod'

const server = new FastMCP({ name: 'assistant' })

server.tool(
  {
    name: 'summarize',
    description: 'Summarize a document',
    input: z.object({ text: z.string() }),
  },
  async ({ text }) => {
    const ctx = server.getContext()

    await ctx.info('Sending document to LLM')
    await ctx.reportProgress(0, 1, 'Sampling…')

    const { content } = await ctx.sample({
      messages: [{ role: 'user', content: { type: 'text', text: `Summarize:\n${text}` } }],
      maxTokens: 512,
    })

    return content.type === 'text' ? content.text : ''
  }
)

Middleware & Auth

import { FastMCP, LoggingMiddleware, RateLimitingMiddleware, jwtVerifier } from '@prefecthq/fastmcp-ts/server'

const server = new FastMCP({
  name: 'secure-server',
  auth: jwtVerifier({
    jwksUri: 'https://auth.example.com/.well-known/jwks.json',
    issuer: 'https://auth.example.com',
    audience: 'my-mcp-server',
  }),
})

server.use(new LoggingMiddleware())
server.use(new RateLimitingMiddleware(100, 60_000))  // 100 requests per minute

await server.run({ transport: 'http', port: 3000 })

Composition

Mount child servers onto a parent with optional name-prefix namespacing.

import { FastMCP, createProxy } from '@prefecthq/fastmcp-ts/server'

const weather = new FastMCP({ name: 'weather' })
weather.tool({ name: 'forecast', description: 'Get a forecast', input: z.object({ city: z.string() }) }, ({ city }) => `Forecast for ${city}`)

// Wrap a remote server as a mountable instance
const maps = await createProxy({ type: 'http', url: 'http://maps-service/mcp' })

const gateway = new FastMCP({ name: 'gateway' })
gateway.mount(weather, 'weather')   // → weather_forecast
gateway.mount(maps, 'maps')         // → maps_<tool_name>

await gateway.run({ transport: 'http', port: 3000 })

Clients

import { Client } from '@prefecthq/fastmcp-ts/client'

const client = await Client.connect('http://localhost:3000')

const tools     = await client.listTools()
const resources = await client.listResources()
const prompts   = await client.listPrompts()

const result = await client.callTool('add', { a: 1, b: 2 })
const config = await client.readResource('config://settings')
const review = await client.getPrompt('review_code', { code: 'const x = 1' })

await client.close()

Use await using for automatic cleanup:

await using client = await Client.connect('http://localhost:3000')
const result = await client.callTool('add', { a: 1, b: 2 })
// client closed automatically on scope exit

Sampling Adapters

Forward LLM sampling requests from servers to your AI provider with a single line:

import { Client, AnthropicSamplingAdapter } from '@prefecthq/fastmcp-ts/client'
import Anthropic from '@anthropic-ai/sdk'

const client = await Client.connect('http://localhost:3000', {
  handlers: {
    sampling: new AnthropicSamplingAdapter(new Anthropic()).asHandler(),
  },
})

Also ships with OpenAISamplingAdapter and GoogleSamplingAdapter.

Multi-Server

Connect to multiple servers from a single client. Tools, resources, and prompts are namespaced by server name automatically.

import { Client } from '@prefecthq/fastmcp-ts/client'

const client = await Client.connect({
  mcpServers: {
    weather: { url: 'http://localhost:3001' },
    maps:    { url: 'http://localhost:3002' },
  },
})

// tool names become weather_forecast, maps_geocode, …
const forecast = await client.callTool('weather_forecast', { city: 'New York' })

Apps

FastMCP ships a server-side component library for building interactive UIs rendered directly in MCP host conversations.

import { FastMCPApp, Column, Row, Text, Input, Button, Table } from '@prefecthq/fastmcp-ts/server'

const app = new FastMCPApp({ name: 'search-app', version: '1.0.0' })

// Entry-point tool: visible to the LLM, auto-linked to a ui:// resource
app.entrypoint(
  { name: 'search', description: 'Search the product catalog' },
  () =>
    Column({}, [
      Text('Product Search'),
      Row({}, [
        Input({ name: 'query', placeholder: 'Search products…' }),
        Button({ label: 'Search', action: app.toolRef('run_search') }),
      ]),
    ])
)

// Backend tool: hidden from the LLM, callable only from within the rendered UI
app.backendTool(
  { name: 'run_search', description: 'Execute the search query' },
  async ({ query }: { query: string }) => {
    const rows = await db.search(query)
    return Table({ columns: ['Name', 'Price', 'Stock'], rows })
  }
)

await app.server.run({ transport: 'http', port: 3000 })

Built-in Providers

Ready-to-mount interactive primitives:

import { FastMCP, Approval, Choice, FileUpload, FormInput } from '@prefecthq/fastmcp-ts/server'
import { z } from 'zod'

const server = new FastMCP({ name: 'my-server' })

server.addProvider(new Approval())    // confirm/deny card injected back into the conversation
server.addProvider(new Choice())      // clickable option list
server.addProvider(new FileUpload())  // drag-and-drop file picker; file bytes never pass through the LLM

// Auto-generated, validated form from any Standard Schema
server.addProvider(
  new FormInput({
    name: 'contact_form',
    description: 'Contact form',
    schema: z.object({ name: z.string(), email: z.string() }),
  }),
)

Generative UI

Let the LLM compose component trees at runtime:

import { FastMCP, GenerativeUI } from '@prefecthq/fastmcp-ts/server'

const server = new FastMCP({ name: 'my-server' })
server.addProvider(new GenerativeUI())
// registers generate_ui and search_components tools

await server.run()

CLI

# Start a server
fastmcp run server.ts
fastmcp run server.ts --transport http --port 3000

# Inspect a server's tools, resources, and prompts
fastmcp inspect --file server.ts
fastmcp inspect --url http://localhost:3000
fastmcp inspect --file server.ts --json
fastmcp inspect --file server.ts --legacy       # force the legacy 2025 era, no probe
fastmcp inspect --file server.ts --pin 2026-07-28  # require that exact era

# Call a tool, read a resource, or get a prompt
fastmcp call add --file server.ts a=1 b=2
fastmcp call config://settings --url http://localhost:3000

# Connect to a running server and list its components
fastmcp list --url http://localhost:3000
fastmcp list --url http://localhost:3000 --resources --prompts --json

# Open the MCP Inspector UI with file-watch reload
fastmcp dev inspector server.ts

# Install into editor/client configs
fastmcp install claude-code server.ts
fastmcp install cursor server.ts
fastmcp install claude-desktop server.ts

# Find locally configured MCP servers
fastmcp discover

fastmcp inspect, fastmcp list, and fastmcp call negotiate the protocol era automatically on every transport: one probe at connect, the modern 2026-07-28 era when the server offers it, and the legacy 2025 era otherwise. Add --legacy to skip the probe and force the legacy era. --pin <version> works on every transport, including HTTP. It forces that exact protocol revision. The connection fails if the server does not offer it. --modern is a deprecated no-op, kept for compatibility.


Ecosystem

Package Role
@modelcontextprotocol/server Official MCP TypeScript SDK v2 — the server-side protocol implementation FastMCP builds on
@modelcontextprotocol/client Official MCP TypeScript SDK v2 — the client-side protocol implementation FastMCP builds on
fastmcp (PyPI) The Python original this project models its API after
@modelcontextprotocol/ext-apps Official MCP Apps extension — foundation for the Apps pillar

README fetched from the repository 1 hours ago. The original is authoritative.

Questions

About Fastmcp Ts

How do I install Fastmcp Ts?

Run claude mcp add fastmcp-ts-fd15 -- npx -y @prefecthq/fastmcp-ts, then add the server to your MCP client's configuration.

Is Fastmcp Ts safe to use with an AI agent?

Its trust score is 47 out of 100 (fair). It passes 3 of the 5 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Fastmcp Ts still maintained?

Yes — the latest release is v1.7.3 (1 Oct 2026), and the last commit was yesterday. The repository has 76 stars and 6 open issues.