← MCP servers · jlowin

FastMCP

BLOCKgrade F · trust 27/100

🚀 The fast, Pythonic way to build MCP servers and clients.

agentsfastmcpllmsmcpmcp clientsmcp serversmcp toolsmodel context protocol

Overview

From the repository's own README, as read at the audited commit.

<div align="center"><!-- omit in toc --><picture>  <source width="550" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/PrefectHQ/fastmcp/main/docs/assets/brand/f-watercolor-waves-4-dark.png">  <source width="550" media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/PrefectHQ/fastmcp/main/docs/assets/brand/f-watercolor-waves-4.png">  <img width="550" alt="FastMCP Logo" src="https://raw.githubusercontent.com/PrefectHQ/fastmcp/main/docs/assets/brand/f-watercolor-waves-2.png"></picture># FastMCP 🚀<strong>Move fast and make things.</strong>*Made with 💙 by [Prefect](https://www.prefect.io/)*[![Docs](https://img.shields.io/badge/docs-gofastmcp.com-blue)](https://gofastmcp.com)[![Discord](https://img.shields.io/badge/community-discord-5865F2?logo=discord&logoColor=white)](https://discord.gg/uu8dJCgttd)[![PyPI - Version](https://img.shields.io/pypi/v/fastmcp.svg)](https://pypi.org/project/fastmcp)[![TypeScript](https://img.shields.io/npm/v/%40prefecthq%2Ffastmcp-ts?label=typescript&color=3178c6)](https://github.com/PrefectHQ/fastmcp-ts)[![Tests](https://github.com/PrefectHQ/fastmcp/actions/workflows/run-tests.yml/badge.svg)](https://github.com/PrefectHQ/fastmcp/actions/workflows/run-tests.yml)[![License](https://img.shields.io/github/license/PrefectHQ/fastmcp.svg)](https://github.com/PrefectHQ/fastmcp/blob/main/LICENSE)<a href="https://trendshift.io/repositories/21461" target="_blank"><img src="https://trendshift.io/api/badge/repositories/21461" alt="prefecthq%2Ffastmcp | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></div>---The [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) connects LLMs to tools and data. FastMCP is a full MCP application framework for servers, clients, and interactive apps. A server starts with ordinary Python:```pythonfrom fastmcp import FastMCPmcp = FastMCP("Demo 🚀")@mcp.tooldef add(a: int, b: int) -> int:    """Add two numbers"""    return a + bi

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. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add fastmcp --env AUTH0_CONFIG_URL=${AUTH0_CONFIG_URL} --env AUTHKIT_DOMAIN=${AUTHKIT_DOMAIN} --env FASTMCP_GITHUB_TOKEN=${FASTMCP_GITHUB_TOKEN} --env FASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGION=${FASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGION} -- uvx fastmcp
claude-desktop
{
  "mcpServers": {
    "fastmcp": {
      "command": "uvx",
      "args": [
        "fastmcp"
      ],
      "env": {
        "AUTH0_CONFIG_URL": "${AUTH0_CONFIG_URL}",
        "AUTHKIT_DOMAIN": "${AUTHKIT_DOMAIN}",
        "FASTMCP_GITHUB_TOKEN": "${FASTMCP_GITHUB_TOKEN}",
        "FASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGION": "${FASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGION}"
      }
    }
  }
}

Exposed tools (200) 265 read · 37 write · 3 destructive

Blast radius: 3 tools can delete or overwrite. An agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
_trigger_docketwritereturn
addwritereturn a + b
add_commentwriteAdd a comment to a request. Returns the updated request.
add_itemwriteAdd a new item to inventory and return the full list.
add_numberswriteAdd two numbers
admin_toolreadreturn
analyze_datareadFilter and analyze sales data. Returns rows, summary, and chart data.
analyze_portfolioreadAnalyze a portfolio of stock symbols.
annotatereadcurrent = trace.get_current_span()
api_healthreadShow health details for each API endpoint.
approve_requestreadApprove a pending request and return updated lists.
ask_namereadresult = await ctx.elicit(
async_echoreadAsync tool for testing
async_toolreadAn async tool.
background_toolreadreturn x
bare_sync_accesswriteheaders = get_http_headers()
bare_toolreadinfo = get_task_context()
batch_processreadProcess batches.
bg_progress_toolreadawait progress.set_total(3)
bg_toolreadawait asyncio.sleep(0.01)
blockedreadreturn
blockingwriteimport time
book_flightreadreturn _ask(
boomreadraise ValueError(
calcreadreturn
calculatewriteAdd two numbers (v1.0).
call_apireadreturn f
capture_docket_idreaddocket_ids.append((call_num, id(docket)))
chargereadCharge a payment (v1.0 - basic).
check_bothreadassert isinstance(docket, Docket)
check_docketreadassert isinstance(docket, Docket)
check_headersreadheaders = _worker_snapshot_headers()
check_permissionreadreturn f
check_request_headerreadreturn _worker_snapshot_headers().get(
check_tokenreadtoken = get_access_token()
check_worker_statusreadreturn f
checkpointreadif ctx.request_state is None:
claimed_toolreadreturn None
combinereadreturn f
computereadCompute something.
confirm_deletedestructiveParks the task on one elicitation before doing the (pretend) deletion.
contact_formwriteShow a form to create a new contact, with a live contact list below.
context_sync_accesswriteheaders = get_http_headers()
coordinatedwritestarted.set()
countreadreturn 1
createwriteCreate item
create_projectwritereturn
create_userwriteCreate a user.
crunchread...
customreadA custom tool
custom-addwritereturn x + y
custom_namereadreturn str(x)
custom_savewritereturn name
custom_toolreadA custom tool
declared_statusreadreturn {
delete_itemdestructiveRemove an item by ID and return the remaining inventory.
demoreadA demo app that exercises various MCP message types.
doublereadreturn n * 2
dynamic_addwriteAdd two numbers with offset
dynamic_multiplyreadMultiply two numbers
echoreadEcho a message back.
echo_with_logsreadEcho a message and emit log notifications.
employee_directoryreadShow a searchable, sortable employee directory.
enabledreadTask enabled
enter_envreadawait ctx.disable_components(tags={
error_toolreadraise ToolError(
excluded_versioned_toolreadreturn
execute_tradewriteExecute a trade (simulated).
exit_envreadawait ctx.reset_visibility()
explicit_toolreadreturn {
explodesreadraise MCPError(code=INTERNAL_ERROR, message=
freadreturn 42
failreadAlways raises an error.
failing_toolreadraise ValueError(
farewellreadSay farewell in their language.
fast_async_toolreadawait anyio.sleep(0.01)
fast_sync_toolwritetime.sleep(0.01)
fast_toolreadreturn x * 2
feature_flagsreadToggle feature flags with live preview.
fetchreadFetch data from
fetch_datareadreturn (
filter_by_categoryreadFilter inventory by category. Pass
filter_datareadFilter sales data by region and/or product.
finance_toolreadreturn
forbiddenreadForbidden tool
foreverreadawait asyncio.Event().wait()
full_namereadresponses = ctx.input_responses
get_auth_typereadauth = headers.get(
get_client_ipreadreturn request.client.host if request.client else
get_market_datareadGet current market data for a symbol.
get_my_emailsreadasync with httpx2.AsyncClient() as client:
get_nodereadGet a node
get_prreadGet a pull request
get_request_detailsreadGet full details for a single request. Available to both model and UI.
get_request_idreadreturn ctx.request_id
get_summaryreadReturn summary statistics for the full dataset.
get_test_file_from_serverread
get_test_pdf_from_urlread
get_user_idreadreturn token.claims.get(
get_weatherreadGet the current weather
greetreadGreet someone in their language.
greet_userreadreturn f
guardreadcalls.append(1)
hidden_toolreadreturn
included_versioned_toolreadreturn
inforeadreturn
inspect_itemsreadreturn {
instant_timeoutreadawait anyio.sleep(0) # Give the event loop a chance to check timeout
internal_toolreadreturn
introspectreadreturn f
leakreadraise ValueError(
list_contactsreadReturn all contacts. Visible to both the model and the UI.
list_requestsreadList requests, optionally filtered by status.
list_usersreadList all system users.
log_progressreadctx.report_progress(50, 100,
long_timeoutreadawait anyio.sleep(0.01)
make_toolreadreturn
mixed_audio_list_fnreadreturn [
mixed_depsreadassert isinstance(ctx, Context)
mixed_file_list_fnreadreturn [
mixed_list_fnreadreturn [
modifywriteModify the data provided.
multi_inputreadParks the task on two elicitations at once, so they can be answered separately.
multiplyreadreturn x * y
my_functionreadreturn f
my_taskread# Works transparently in both foreground and background task modes
my_toolreadA tool
mytoolreadreturn
new_toolreadreturn
no_task_toolreadreturn
normal_toolreadreturn config[
okreadreturn
old_toolreadreturn
onereadreturn 1
one_questionreadresponses = ctx.input_responses
only_v5readreturn
pickreadreturn
pingreadPing the server
plan_dinnerreadPlan a dinner menu, asking the user what they
positional_nameread
premium_toolreadreturn
private_toolreadreturn f
process_datareadreturn f
progress_toolreadawait ctx.report_progress(0, 100,
project_overviewreadShow project details organized in tabs.
protectedreadreturn
protocol_error_jobreadRaises a protocol-level error: `failed` with an inlined `error`.
quarterly_revenuereadShow quarterly revenue as a bar chart.
queryreadreturn []
query_datareadassert connection.is_open
query_dbreadreturn f
query_syncwriteassert connection.is_open
quick_taskreadreturn value * 2
quick_toolreadreturn value * 2
read_itreadval = await ctx.get_state(
refreshreadCollect fresh system stats.
regular_toolreadreturn
reject_requestreadReject a pending request and return updated lists.
rememberreadfacts = await session.get(
remote_task_toolreadA remote tool that supports tasks
reportreadreturn note
reset_user_passworddestructiveReset a user
return_audioreadreturn Audio(path=str(test_audio))
return_boolreadreturn True
return_bytesreadreturn b
return_dataclassreadreturn PersonDataclass(name=
return_datetimereadreturn datetime(2025, 11, 5, 12, 30, 45)
return_dictreadreturn {
return_embedded_resourcereadreturn EmbeddedResource(
return_empty_dictreadreturn {}
return_empty_listreadreturn []
return_filereadreturn File(path=str(test_file))
return_floatreadreturn 3.14159
return_image_contentreadreturn ImageContent(
return_image_datareadreturn Image(data=test_image.read_bytes(), format=
return_image_pathreadreturn Image(path=str(test_image))
return_intreadreturn 42
return_listreadreturn [
return_mixed_contentreadreturn [
return_modelreadreturn UserData(name=
return_nonereadreturn None
return_optionalreadreturn
return_optional_nonereadreturn None
return_pathreadreturn Path(
return_resource_linkreadreturn ResourceLink(
return_setwritereturn {1, 2, 3}
return_stringreadreturn
return_text_contentreadreturn TextContent(type=
return_tuplereadreturn (42,
return_typeddictreadreturn {
return_unionreadreturn
return_union_intreadreturn 123
return_uuidreadreturn UUID(
runwriteRun something
run_querywrite...
sales_chartreadShow monthly online vs. retail sales as a bar chart.
sales_dashboardreadCompany sales dashboard with KPIs, revenue trends, segment breakdown, and recent deals.
sample_toolreadreturn x * 2
savewritereturn f
save_contactwriteSave a new contact and return the updated list.

Details

Source
jlowin/fastmcp
PyPI
fastmcp
Transports
sse · stdio · streamable-http
Credentials it reads
AUTH0_CONFIG_URLAUTHKIT_DOMAINFASTMCP_GITHUB_TOKENFASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGIONFASTMCP_SERVER_AUTH_AWS_COGNITO_CLIENT_IDFASTMCP_SERVER_AUTH_AWS_COGNITO_CLIENT_SECRETFASTMCP_SERVER_AUTH_AWS_COGNITO_USER_POOL_IDFASTMCP_SERVER_AUTH_AZURE_CLIENT_IDFASTMCP_SERVER_AUTH_AZURE_CLIENT_SECRETFASTMCP_SERVER_AUTH_AZURE_TENANT_IDFASTMCP_SERVER_AUTH_CLERK_CLIENT_IDFASTMCP_SERVER_AUTH_CLERK_CLIENT_SECRET
License
Apache-2.0
Stars
27,717 · pushed 0d ago

Trust audit

Do not install this without reading the findings. The audit found something that could harm you or your machine.

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

What the source does

Filesystem
declared (4 observation(s))
Network
declared (2 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
fastmcp_slim/fastmcp/server/providers/skills/_common.py:105
parsed = yaml.load(frontmatter_text, Loader=yaml.BaseLoader)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHPrompt injection · prompt.hide_from_user · CWE-94, CWE-1427
docs/getting-started/upgrading/from-mcp-sdk-v2.mdx:87
FastMCP has no resolver injection, but the underlying requests survive in a different shape: on a modern connection `Elicit`, `Sample`, and `ListRoots` all ride the guard pattern, where the tool retur
Why it matters. asks the agent to act without the user's knowledge
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/code-review
.claude/skills/code-review
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/fix-issue
.claude/skills/fix-issue
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/python-tests
.claude/skills/python-tests
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/release
.claude/skills/release
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/review-issue
.claude/skills/review-issue
Why it matters. link not followed
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
fastmcp_slim/fastmcp/server/__init__.py:14
return importlib.import_module(f"fastmcp.server.{name}")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
fastmcp_slim/fastmcp/server/providers/filesystem_discovery.py:197
return importlib.import_module(private_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
fastmcp_slim/fastmcp/server/providers/filesystem_discovery.py:213
return importlib.import_module(module_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
fastmcp_slim/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py:132
server_module = importlib.import_module(module_name)
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
examples/memory.py:40
DB_DSN = "postgresql://postgres:postgres@localhost:54320/memory_db"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
examples/memory.py:302
"postgresql://postgres:postgres@localhost:54320/postgres"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/server/http/test_stale_access_token.py:60
token="stale-token-from-initial-auth",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/server/http/test_stale_access_token.py:68
token="fresh-token-after-refresh",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/server/http/test_stale_access_token.py:206
token="sdk-token-no-subject",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/server/auth/test_jwt_provider.py:208
assert "-----BEGIN PRIVATE KEY-----" in private_pem
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
confirm_delete, delete_item, reset_user_password
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.ccignore
.ccignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.coderabbit.yaml
.coderabbit.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.ccignore
.ccignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
examples/tasks/.envrc
.envrc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
.github/scripts/test-ci-workflows.mjs:20
print(json.dumps({name: yaml.load(Path(f'.github/workflows/{name}.yml').read_text(), Loader=yaml.BaseLoader)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
tests/utilities/json_schema_type/test_real_world_schemas.py:204
spec = yaml.load(spec_file.read_text(), Loader=CSafeLoader)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-09-18 · audit v0.4.0 · source sha cfbc52f849e6 · full audit: observations/trust-audit/mcp-server/jlowin__fastmcp.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-18cfbc52f849e6BLOCKF27first audit

Alternatives

Other servers in the same categories, safer ones first.

Questions

What is the FastMCP MCP server?

🚀 The fast, Pythonic way to build MCP servers and clients.

What tools does FastMCP expose?

200 in total: 265 read-only, 37 that write, and 3 that can delete or overwrite (confirm_delete, delete_item, reset_user_password). Every one is listed on this page with its risk.

Is FastMCP safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (27/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does FastMCP need?

It reads AUTH0_CONFIG_URL, AUTHKIT_DOMAIN, FASTMCP_GITHUB_TOKEN, FASTMCP_SERVER_AUTH_AWS_COGNITO_AWS_REGION, FASTMCP_SERVER_AUTH_AWS_COGNITO_CLIENT_ID, FASTMCP_SERVER_AUTH_AWS_COGNITO_CLIENT_SECRET, FASTMCP_SERVER_AUTH_AWS_COGNITO_USER_POOL_ID, FASTMCP_SERVER_AUTH_AZURE_CLIENT_ID, FASTMCP_SERVER_AUTH_AZURE_CLIENT_SECRET, FASTMCP_SERVER_AUTH_AZURE_TENANT_ID, FASTMCP_SERVER_AUTH_CLERK_CLIENT_ID and FASTMCP_SERVER_AUTH_CLERK_CLIENT_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does FastMCP run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as fastmcp.

How current is this page?

The grade is for one exact copy of the source (cfbc52f849e6), read on 2026-09-18. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-18 · job trust-audit-2026-09-18