Atlas / MCP servers / prefecthq / fastmcp-ts

fastmcp-tsCAUTION

mcp/prefecthq/fastmcp-ts

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

Verdict
CAUTION
Grade
C
Trust score
76 /100
Exposed tools
200 205r · 16w · 6d
Transport
stdio · streamable-http
License
—
Stars
75
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

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 }) =>
Read from source at commit 269acc757599OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add fastmcp-ts -- npx -y @prefecthq/[email protected]
claude-desktop
{
  "mcpServers": {
    "fastmcp-ts": {
      "command": "npx",
      "args": [
        "-y",
        "@prefecthq/[email protected]"
      ]
    }
  }
}
03

Exposed tools (200)

205 read · 16 write · 6 destructive. Blast radius: 6 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
areadtest
a-datareaddata from A
addwriteadds two numbers
add_notewriteAdd a new note to the hub.
added_after_listenwriteTrigger list change
added_laterwriteadded after sync
admin-onlyreadtest
admin-toolreadAdmin only tool
allLevelsreada tool
alphareadtest tool
always-failsreadAlways throws an error
analyze_notesreadAsk the LLM (via sampling) to analyze all notes. Requires a sampling-capable client.
anotherToolreadtest
app_toolreadApp-only tool
applereadtest tool
approval_confirmreadRecord a confirmed approval decision
approval_denyreadRecord a denied approval decision
approval_requestreadPresent a confirm/deny approval card to the user
arg1readFirst test argument
arg2readSecond test argument
askreadask
assistreadtest
audreadtest
breadtest
b-datareaddata from B
b-itemreaditem template
backend_actionreadBackend action
badreadtest
betareadtest tool
bigreadbig
binreadtest
blockedreadblocked
boomreadboom
both_toolreadBoth
creadc
callreadCall a tool, resource, or prompt on an MCP server
checkreadtest
choice_presentreadPresent a list of options for the user to choose from
choice_selectreadRecord the user
claude-codewriteInstall MCP server into Claude Code (~/.claude.json)
claude-desktopwriteInstall MCP server into Claude Desktop
codereadCode to review
collect_inforeadCollect user info
computereadCompute
confirmreadneeds confirmation
confirmDeletedestructiveDelete after confirmation
convert_lengthreadConvert a value between length units (m, km, cm, mm, ft, in, mi, yd).
convert_temperaturereadConvert a value between temperature units (C, F, K).
convert_weightreadConvert a value between weight units (kg, g, mg, lb, oz, st).
countreadcount
ctxreadtest
ctxPromptreadtest
cursorwriteInstall MCP server into Cursor (~/.cursor/mcp.json)
customreadtest
datareada tool
deepreaddeep
degeneratereadinputRequired with an empty inputRequests object
delete-filedestructiveDelete a file
deleteFilesdestructiveDelete files, asking for confirmation first
deleteFilesStatefuldestructiveDelete files, threading server-minted state across the round-trip
deleteStatereadtest
delete_notedestructivePermanently delete a note. Requires the admin scope.
devreadDevelopment utilities
discoverreadDiscover MCP servers from known config files
docreadtest
dual_toolreadDual tool
dynamicreada tool
echoreada tool
echo_envreadReturn the value of an environment variable
elicitorreada tool
embedded-resourcereadAn embeddable text resource
existingreadalready there
explainreadtest
explodereadtest tool
extendedreada tool
failreadfail
fastreadtest
fetchreadtest tool
fetch-weatherreadFetch current weather conditions
fetch_datareadFetch data
fetch_notes_tablereadReturn all notes as a rendered table component.
file_upload_deletedestructiveDelete a previously uploaded file by its handle
file_upload_openwriteOpen a file picker UI for the user to upload a file
file_upload_submitwriteReceive and store uploaded file bytes server-side
firstreadtest tool
formatread
gammareadtest tool
geminiwriteInstall MCP server into Gemini CLI (~/.gemini/settings.json)
generate_uiwriteExecute a UI component expression and return the component tree. Use search_components to discover available component APIs first.
getIdreadtest
getRootsreada tool
getStatereadtest
getUserreadGet a user
get_notereadRetrieve a single note by ID.
get_timereadReturn the current UTC time. No auth required.
get_weatherreadGet weather
goosewriteInstall MCP server into Goose (~/.config/goose/config.yaml)
greetreadSay hello
greetingreadA greeting
guardedreadGuarded
helloreadhello prompt
hiddenreadtest
idreadNote ID to review
imgreadtest
initialreada tool
inspectreadInspect tools, resources, and prompts from an MCP server
inspectorreadLaunch the MCP inspector for a server file
installwriteInstall an MCP server into a client config
internalreadInternal
internal_promptreadInternal
internal_toolreadInternal
json_schema_2020_12_toolreadTool with JSON Schema 2020-12 features
langreadoutput language
languagereadLanguage hint
late_deepreadadded late to grandchild
late_promptreadadded late
late_toolreadadded late
linkreadtest
listreadList tools, resources, and prompts from an MCP server
list_notesreadList all notes, optionally filtered by tag.
list_promptsreadList all available MCP prompts
list_resourcesreadList all available MCP resources
loggerreada tool
logitreadlog
mangoreadtest tool
mcp-jsonwriteInstall MCP server into local mcp.json
model_toolreadModel tool
multireada tool
my_formreadA form
my_toolreadMy tool
namereadWho to greet
namedreada tool
newreadtest
new-toolreada tool
newPromptreadadded after connect
newToolreadadded after connect
new_promptreadnew
new_toolreadtriggers notification
noTokenreadtest
noargsreadtest
noisyreadlogs then returns
noopreadx
notereadA note
notes_dashboardreadOpen the interactive Dev Notes Hub dashboard.
old_promptreadold
old_toolreadOld
openreadOpen
open_areadOpen A
open_appreadOpen app
open_breadOpen B
open_dashboardreadOpen the status dashboard UI.
originalreadoriginal
preadp
pingreadreturns pong
probereadtest
progressorreada tool
protected_toolreadRequires read scope
publicreadpublic tool
public-toolreadPublic tool
public_promptreadPublic
public_toolreadNo auth required
readreadread
refreshreadRefresh data
refresh_statusreadBackend action invoked from the dashboard UI.
rememberreadwrites session state
resourceUrireadURI of the resource to embed
resultreadextended result
reviewreadReview code
review_notereadBuild a constructive review prompt for a specific note.
rootserreadcalls ctx.listRoots
runwriteStart an MCP server from a file
samplerreada tool
searchreadSearch
search_componentsreadList available UI components with their types and descriptions
secondreadtest tool
secretreadsecret
setStatereadtest
showreadShow
show_dashboardreadShow the dashboard
slowreadslow
soon_gonereadwill be removed
spyreada tool
static-binaryreadA static binary resource
static-textreadA static text resource
streamreadLog before returning
stylereadtone
submit_notewriteHandle the add-note form submission from the dashboard.
sumChunkedreadsum a large array a few items at a time
summarizereadSummarize text
summarize_notesreadBuild a prompt asking the LLM to summarize all notes.
template-datareadA resource template keyed by id
test_audio_contentreadReturns an audio content block.
test_elicitationreadRequests user input from the client via elicitation.
test_elicitation_sep1034_defaultsreadElicits input with per-field default values (SEP-1034).
test_elicitation_sep1330_enumsreadElicits input with all enum schema variants (SEP-1330).
test_embedded_resourcereadReturns an embedded resource content block.
test_error_handlingreadAlways returns a tool-level error result.
test_image_contentreadReturns an image content block.
test_multiple_content_typesreadReturns text, image, and embedded-resource content blocks.
test_prompt_with_argumentsreadA prompt with two required arguments
04

Trust audit

CAUTIONgrade C · trust 76/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (6 observation(s))
Network
declared (6 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMInventory / provenance · inv.binary · CWE-1104
src/server/openapi/parser.ts
parser.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
conformance-baseline-main.yml:26
#             --url http://127.0.0.1:39750/mcp --suite all
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/server/auth.test.ts:802
token: 'access-token-to-revoke',
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
confirmDelete, delete-file, deleteFiles, deleteFilesStateful, delete_note, file_upload_delete
Why it matters. 6 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/dev/inspector.ts:3
import { parseFileSpec } from '../../utils/file-spec.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/dev/inspector.ts:4
import { resolveEntrypointBootstrapPath, buildEntrypointEnv } from '../../utils/entrypoint-bootstrap.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/dev/inspector.ts:5
import { cliError, formatError } from '../../utils/error.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/dev/inspector.ts:6
import { log } from '../../ui/output.js'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/commands/dev/inspector.ts:7
import { theme } from '../../ui/theme.js'
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/conformance-nightly.yml:71
--url http://127.0.0.1:39750/mcp \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/servers/running.mdx:101
console.log(server.address)                                          // e.g. http://127.0.0.1:54123/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/apps/providers.test.ts:229
new URL(`http://127.0.0.1:${port}/mcp`),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/browser/oauth-e2e.spec.ts:89
baseUrl = `http://127.0.0.1:${mcp.address.port}`
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/client/auth.test.ts:1186
expect(atob(headers.Authorization.slice('Basic '.length))).toBe(
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
examples/kitchen-sink/package.json
zod, tsx
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
examples/unit-converter/package.json
zod, tsx
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@clack/prompts, @modelcontextprotocol/client, @modelcontextprotocol/core, @modelcontextprotocol/node, @modelcontextprotocol/server, @modelcontextprotocol/server-legacy, @standard-schema/spec, @types/e
Why it matters. 39 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/api/server/interfaces/CorsOptions.mdx:36
Send `Access-Control-Allow-Credentials: true`. Requires an explicit
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/servers/running.mdx:158
`origin` accepts `'*'` (the default), one origin, an array of origins, or a function over the request's `Origin` header. With any non-`*` value the server echoes an allowed origin back (with `Vary: Or
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
AGENTS.md:155
**SSE resumability (SEP-1699):** the legacy (2025-era, sessionful) Streamable HTTP branch (`_dispatchLegacyHttp`) constructs the SDK transport with a bounded per-session `eventStore` (`src/server/lega
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
AGENTS.md:327
| `FileUpload` | `file_upload_open`, `file_upload_submit`, `file_upload_delete` (+ `ui://files/{handle}` resource) | `submit` stores bytes via `FileStorageAdapter` and returns a server-minted `FileHan
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
AGENTS.md:399
`OAuth` also supports Client ID Metadata Documents (CIMD, SEP-991) via `OAuthOptions.clientMetadataUrl` — an HTTPS URL the client presents as its identity in place of Dynamic Client Registration, vali
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
AGENTS.md:401
**Non-interactive token providers** all implement `AsyncHeaderAuth` (`kind` + async `getHeaders()`) and share one `TokenCache` (store read → expiry check → single-flight fetch → normalize → persist);
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:36
- 1b458b9: Framework logs are now configurable. `FastMCPOptions.logger` accepts any object with `debug`/`info`/`warn`/`error` methods (console and Winston work directly; Pino needs a four-line adapter
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-12 · audit v0.4.1 · source sha 269acc757599full audit observations/trust-audit/mcp-server/prefecthq__fastmcp-ts.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12269acc757599CAUTIONC76first audit
06

Questions

What is the @prefecthq/fastmcp-ts MCP server?

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

What tools does @prefecthq/fastmcp-ts expose?

200 in total: 205 read-only, 16 that write, and 6 that can delete or overwrite (confirmDelete, delete-file, deleteFiles, deleteFilesStateful, delete_note). Every one is listed on this page with its risk.

Is @prefecthq/fastmcp-ts safe to connect to an agent?

With care. The audit graded it C (76/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 6 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @prefecthq/fastmcp-ts need?

No credential environment variables were found in its source, so it appears to need none.

How does @prefecthq/fastmcp-ts run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @prefecthq/fastmcp-ts at 1.7.3.

How current is this page?

The grade is for one exact copy of the source (269acc757599), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement