Skip to main content
Glama

Project Development MCP Server

A FastMCP server that exposes predefined artifacts (templates, configs, code snippets, assets) as Resources and project lifecycle operations as Tools. Use it from Cursor or any MCP client to create, update, deploy, debug, test, monitor, and configure projects with minimal token usage.

Recommended: HTTP transport. Run the server once; all clients (Cursor, other IDEs, CLIs) connect to the same URL. One process, shared use, no per-client spawn.

Setup

With Nix and devenv installed:

cd project-mcp
devenv up

This installs Python and uv, runs uv sync, and starts the MCP server on HTTP at http://localhost:8000/mcp. Leave it running; point Cursor and other clients at that URL. Use direnv allow if you use direnv (optional for devenv up).

Option B: uv only

cd project-mcp
uv sync

Related MCP server: my-mcp-server

Running the server

HTTP (recommended) — one server for all clients:

# With devenv (starts HTTP server)
devenv up

# Or with uv only (HTTP is the default)
uv run python server.py

Server base URL: http://localhost:8000/mcp (port 8000 unless you set MCP_PORT). Connect Cursor and other clients to this URL; no need for each client to run the server. When using HTTP, a /health endpoint returns {"status": "ok"} for load balancers or k8s probes.

Stdio (alternative) — Cursor or another client runs the server as a subprocess (one process per client). Set MCP_TRANSPORT=stdio or use the fastmcp CLI:

MCP_TRANSPORT=stdio uv run python server.py
# or
uv run fastmcp run fastmcp.json

Use stdio if you prefer zero “run the server” step and only one client.

Configuration

  • PROJECT_MCP_ROOT — Root directory for project paths (default: current working directory). All tool paths (target_path, project_path, path) must resolve under this root; path traversal (e.g. ../) is rejected. Set this to your workspace or a dedicated projects directory to scope and secure where the server can read/write. At startup, the server warns if this is set but not a directory or missing.

  • PROJECT_MCP_ALLOWED_COMMANDS — Comma-separated list of command prefixes allowed by run_command (e.g. python,npm,uv). If unset, defaults to: python, npm, npx, uv, pip, node, pytest, make.

  • MCP_TRANSPORThttp (default) or stdio.

  • MCP_PORT — Port for HTTP (default: 8000).

  • LOG_LEVEL — Logging level (default: INFO). Set to DEBUG for more verbose tool logs.

Running tests

Install dev dependencies (pytest, ruff), then run the test suite:

uv sync --extra dev
uv run pytest tests/ -v

To run linting and format checks (same as CI):

uv run ruff check .
uv run ruff format --check .

Cursor integration

HTTP (recommended): Run the server once (e.g. devenv up or the HTTP command above), then add the server in Cursor by URL. Example MCP config (e.g. in Cursor Settings → MCP or .cursor/mcp.json):

{
  "mcpServers": {
    "project-dev": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

If your Cursor version uses a different shape (e.g. transport: "sse" with a separate url), see Cursor + FastMCP. Use your actual host/port if not localhost. All Cursor windows and other clients can use the same running server.

Stdio (alternative): Cursor runs the server itself. In MCP settings use a command instead of a URL:

{
  "mcpServers": {
    "project-dev": {
      "command": "uv",
      "args": ["run", "fastmcp", "run", "fastmcp.json"],
      "cwd": "/absolute/path/to/project-mcp"
    }
  }
}

Replace /absolute/path/to/project-mcp with the real path.

Artifacts and URI scheme

Predefined content is organized by context first (folder under artifacts/), then type (folder under each context). Context is a flexible grouping—maintainers choose the strategy that fits their needs (e.g. by technology, project type, or other axes).

URI pattern: artifact://{context}/{type}/{path}

Part

Purpose

Examples

context

Grouping chosen by maintainer

default (generic), fastapi, react, internal-admin, data-pipeline

type

Kind of artifact under that context

templates, configs, snippets, assets, components, iac

path

Relative path under context/type

fastapi-app, pyproject.toml, Button.tsx

Context examples:

  • By technology: fastapi, react, aws, gcp

  • By project type: internal-admin, data-pipeline, research-notebook, app-documentation

  • default: generic, stack-agnostic artifacts only

URI examples:

  • artifact://default/configs/pyproject.toml — generic Python config

  • artifact://default/snippets/hello.py — generic hello snippet

  • artifact://fastapi/templates/fastapi-app — FastAPI app template

  • artifact://react/templates/react-component.tsx — React component template

  • artifact://data-pipeline/configs/dag.yaml — data pipeline DAG config

Add new contexts by adding a folder under artifacts/; add new types by adding a folder under a context. No server code changes required. Use Resources to read these URIs on demand so the LLM does not hold large blobs in context.

Tools

Tool

Description

list_artifacts

List available artifacts (optionally filter by context/type). Returns JSON with uri per artifact.

create_project

Create project from a template; use context to pick the group. Optional variables for {{key}} substitution.

read_file

Read a file at path (under project root).

list_directory

List directory contents at path (one level).

search_files

Search for regex pattern in project files; optional include/exclude globs.

edit_file

Replace old_string with new_string in file (first or all).

write_file

Write or overwrite a file under the project root.

run_tests

Run tests (pytest or npm test).

deploy

Run deploy (Makefile, npm run deploy, or custom script).

run_command

Run an allowed command in project dir (python, npm, uv, etc.).

status

Project status and detected type.

get_logs

Recent log content from .log files.

get_config

Read config key (e.g. name, version) from pyproject/package.json.

update_config

Update name or version in pyproject.toml or package.json.

All paths are validated against PROJECT_MCP_ROOT to prevent path traversal.

Usage examples

From an MCP client (e.g. Cursor), you can call tools and read resources like this:

Discover artifacts: Call list_artifacts() (or list_artifacts(context="fastapi")) to get a JSON list of artifact URIs, then read any via the Resource artifact://{context}/{type}/{path}.

Create a FastAPI project:

create_project(template_id="fastapi-app", target_path="./my-api", context="fastapi")

Create a project with template variables: If the template contains {{project_name}} or {{version}}, pass them in:

create_project(template_id="var-test", target_path="./my-app", context="default", variables={"project_name": "MyApp", "version": "1.0"})

Write a file: write_file(path="src/main.py", content="print('hello')")

Project status: status(project_path=".") — returns detected type (Python/Node) and top-level listing.

Run tests: run_tests(project_path=".") — runs pytest or npm test based on project type.

Project layout

project-mcp/
├── server.py           # FastMCP app and registration
├── path_util.py        # Path validation helpers
├── artifact_loader.py  # Artifact discovery and read (type/context/path)
├── fastmcp.json        # FastMCP project config
├── devenv.nix          # Nix + devenv (packages, process)
├── devenv.yaml         # Devenv inputs
├── .envrc              # direnv: use devenv
├── pyproject.toml
└── artifacts/          # Client-facing content: artifact://{context}/{type}/{path}
    ├── default/       # generic, stack-agnostic only
    │   ├── configs/   # pyproject.toml, tsconfig.json, Dockerfile
    │   ├── snippets/  # hello.py
    │   └── assets/    # placeholder.svg
    ├── fastapi/       # context: technology
    │   └── templates/ # fastapi-app
    ├── react/         # context: technology
    │   └── templates/ # react-component.tsx
    # Add contexts as needed: internal-admin/, data-pipeline/, aws/, gcp/, etc.

License

MIT.

Available Tools

14 tools
deployC
Destructive

Trigger deployment for a project (runs deploy script or make deploy).

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
optionsNo
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the agent knows this is an external, mutating operation. The description adds the internal mechanism (runs deploy script or make deploy), which is useful, but says nothing about what the deployment destroys or overwrites, whether it is long-running, or what permissions it needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short, front-loaded sentence with no filler. The parenthetical is efficiently scoped to mechanism rather than restating the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists so return values need no explanation, this is a destructive, open-world operation with two undocumented required parameters and no stated side effects or prerequisites. The definition leaves too much for the agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, including two required ones. The description never explains what project_path or target mean, and target in particular is entirely opaque with no enum or format hint, so it fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Trigger deployment for a project") and adds the mechanism (deploy script or make deploy), so the outcome is unambiguous. It does not distinguish itself from siblings like run_command or run_tests, which could plausibly also be used for deployment-style work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no named alternative. An agent cannot tell from the description whether deploy should be preferred over run_command for the same effect, which is the key routing decision among these siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_fileB
Destructive

Replace old_string with new_string in file. replace_all: all (default) or first only.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
new_stringYes
old_stringYes
replace_allNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint=true annotation already flags this as a mutating operation. The description usefully adds that replacement applies to all occurrences by default, which is meaningful destructive behavior, but omits what happens when old_string is missing or ambiguous, and gives no permission or error context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the mutation semantics front-loaded and no filler. Slightly telegraphic, but every phrase carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the core replace mechanics are covered. However, for a destructive edit tool with zero documented parameters, missing error/ambiguity behavior and path semantics leave real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden. It explains old_string/new_string and the replace_all intent, but the phrasing 'all (default) or first only' never maps the two states to the boolean true/false, and 'path' is completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (replace) and resource (file), plus the exact substitution semantics of old_string/new_string. It does not differentiate itself from the sibling write_file, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus siblings like write_file or update_config, and no statement of prerequisites (e.g. the file must already exist, old_string must match uniquely). The only conditional information given is the replace_all behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_configB
Read-only

Read a config value from project (e.g. pyproject name, package.json name).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=true annotation already establishes this is a safe read, so the description only needs to add context. It confirms the config is read from a project, but says nothing about behavior when the key is missing, what file formats are parsed, or error handling. With annotations covering the safety profile and an output schema covering returns, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the verb and resource front-loaded and examples in parentheses. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since an output schema exists, return values need not be explained. But for a two-parameter tool with 0% schema coverage, the description should say more about project_path format and key lookup semantics; it only addresses key via loose examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for both required parameters. The description partially compensates for 'key' by showing example values (pyproject name, package.json name), but 'project_path' format (absolute vs relative, directory vs file) is entirely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Read') and resource ('a config value from project') and grounds it with concrete examples (pyproject name, package.json name). It implicitly contrasts with the sibling update_config by being the read side, though it never states that contrast explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples convey the general use case (fetching project metadata like the pyproject or package.json name), which implies when to reach for it. However, there is no explicit guidance on when to use this versus update_config or the file-reading siblings, and no mention of prerequisites or failure conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_logsB
Read-only

Read recent log content from project (looks for log files or .log).

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNo
sourceNostdout
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safe-read profile. The description adds useful behavioral detail about how it locates logs (log files or .log), but says nothing about which source is read by default or how many lines are returned, though the output schema covers return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core action front-loaded and no filler. It is efficient, though the brevity comes at the cost of the missing guidance noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, but for a 3-parameter tool with 0% schema coverage the description is thin: the two non-required parameters and the selection logic between file logs and stdout are left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It only loosely gestures at 'project' (mapping to project_path) and says nothing about 'lines' or 'source', which defaults to 'stdout' and sits oddly against the 'log files or .log' framing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read recent log content from project') and adds a hint about its resolution strategy ('looks for log files or .log'). An agent can distinguish it as a log-oriented reader, but it never names or contrasts with the obvious sibling read_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance. It does not explain when to prefer this over read_file, search_files, or run_command, leaving the agent to infer the use case from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_artifactsB
Read-only

List artifacts; filter by context/type. Returns JSON with uri per artifact.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
contextNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes this as a safe read, so the description only needs to add context. It does note the return payload ('JSON with uri per artifact'), which is useful, but says nothing about pagination, result limits, or auth requirements that an agent calling a list tool would want.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact clauses, filter capability front-loaded right after the verb, and no filler. Efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The existing output schema covers return structure, so the description need not explain it. However, with 0% parameter documentation and no indication of result size or defaults, the definition leaves an agent short of what it needs to call this reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for the two parameters. It names both (context, type) but adds no format, allowed values, or matching semantics, leaving the agent unable to supply a meaningful value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List artifacts') plus the capability to filter by context/type, so the agent knows exactly what it does. It lacks any differentiation from the many file/directory sibling tools, which keeps it out of 5 territory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says it filters by context/type but gives no guidance on when to use this tool versus siblings like list_directory or search_files, nor any preconditions. Usage is only faintly implied by the filter mention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_directoryA
Read-only

List directory contents at path (relative to PROJECT_MCP_ROOT or cwd). One level only.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds real behavioral context: path resolution semantics (relative to PROJECT_MCP_ROOT or cwd) and the non-recursive depth constraint. It does not discuss error behavior for missing directories, but the output schema covers return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, zero filler, with the core action front-loaded and the depth constraint immediately after. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and readOnlyHint covers the mutation question. Combined with the stated path basis and depth limit, the definition is sufficient to call correctly; only edge-case behavior on invalid paths is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the single path parameter, and it does: it explains what the path is resolved against. The implicit default (".") is documented in the schema itself but the resolution basis is only in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List directory contents") and adds two scoping qualifiers: path is relative to PROJECT_MCP_ROOT or cwd, and listing is one level deep only. That is enough for an agent to know it is a non-recursive listing rather than a recursive search, though it never names a sibling like search_files to make differentiation explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: "One level only" signals that recursive or pattern-based discovery belongs elsewhere, which nudges toward search_files without saying so. No explicit when-to-use, when-not-to-use, or prerequisite statements are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_fileA
Read-only

Read a file at path (relative to PROJECT_MCP_ROOT or cwd). Returns content or error.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds two useful behavioral facts the annotation doesn't cover: path resolution scope (PROJECT_MCP_ROOT or cwd) and that errors are returned rather than thrown. That's modest added value, hence 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence front-loads the action, the argument, and the resolution rule, then the return behavior. No padding, nothing repeated from annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shapes needn't be re-explained; the description still notes content-or-error. For a single-parameter read tool this is essentially complete, with only the lack of sibling routing guidance as a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 0% schema description coverage, so the description must carry the burden — and it does by explaining that 'path' is resolved relative to PROJECT_MCP_ROOT or cwd. That's the key semantic an agent needs and it's absent from the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (a file at path) and clarifies the path base (PROJECT_MCP_ROOT or cwd). It doesn't explicitly contrast with siblings like write_file or edit_file, but the read intent is unambiguous against them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (any time file content is needed) and gives the path-resolution context, but it names no alternatives or exclusions relative to sibling read/write tools. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_commandC

Run a command in project dir. Allowed prefixes: PROJECT_MCP_ALLOWED_COMMANDS or default.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNo
commandYes
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, so the description carries the burden and does add the useful constraint that commands are limited to PROJECT_MCP_ALLOWED_COMMANDS prefixes. That is real behavioral context (a security boundary), but it omits blocking/timeout behavior, shell semantics, and what 'or default' actually permits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and zero padding. The trailing 'or default' clause is slightly cryptic but overall it is tight and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a generic command-execution tool with a destructiveHint-adjacent annotation (readOnlyHint=false), 0% param coverage, and only an opaque reference to an env-var allowlist. Output schema covers returns, but the description leaves working-dir vs project_path semantics, env behavior, and execution safety unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does not. It hints that a command runs in a project dir (loosely explaining project_path), but never explains the 'command' format or what the 'env' parameter does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Run') and resource ('a command in project dir'), so the core action is immediately clear. However, it does nothing to distinguish itself from siblings like run_tests or deploy, nor to signal its generic shell-execution scope beyond the word 'command'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names an allowed-prefix constraint but gives no when-to-use guidance and no comparison to alternative execution tools such as run_tests or deploy. An agent gets no signal about when this generic runner is preferable to the more specific siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_testsC

Run tests in project (pytest for Python, npm test for Node).

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
extra_argsNo
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Only readOnlyHint=false is provided, so the description should carry most of the burden. It adds the framework mapping (pytest vs npm test), which is useful, but says nothing about runtime, failure behavior, exit codes, or whether side effects (build artifacts, test DBs) occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the core action front-loaded. It is tight, though the parenthetical example format is the only structure present and there is no room for the missing usage or parameter detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, but two of three parameters remain undocumented and there is no guidance on when to choose this over run_command. For a 3-param execution tool this leaves notable gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for 3 parameters. The description only implicitly covers project_path ('in project'); scope and extra_args are entirely undocumented in both schema and description, leaving the agent to guess their formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run tests') and even names the underlying commands per ecosystem (pytest, npm test), which an agent can act on. However, it never distinguishes itself from the sibling run_command, which can also execute tests, so sibling differentiation is absent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance and no mention of run_command as the generic alternative. The agent must infer that this tool is preferred over run_command for test execution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_filesB
Read-only

Search for regex in project files. include/exclude globs. Returns path:line_num: line.

ParametersJSON Schema
NameRequiredDescriptionDefault
excludeNo
includeNo
patternYes
max_matchesNo
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safety profile, so the description need not restate it. It does add the return shape (path:line_num: line), but omits whether the search is recursive, how binary/large files are handled, and any limits beyond the default max_matches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight fragments with the core purpose front-loaded and zero filler. The telegraphic style is efficient, though the clipped phrasing slightly reduces readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-format sentence is a bonus rather than a necessity. However, with 5 parameters at 0% schema coverage and no usage routing, the definition leaves real gaps for the agent to guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden, yet it only glosses include/exclude globs and the regex pattern. project_path and max_matches (default 200) receive no explanation, leaving two of five parameters undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search), resource (project files), and mechanism (regex), which clearly separates it from read_file, list_directory, and edit_file. It does not explicitly name a sibling alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use, when-not-to-use, or alternative-routing guidance. Usage is only inferable from the verb itself; nothing tells the agent how this differs from read_file or list_directory for content discovery.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusB
Read-only

Return project status: detected type, key files, and recent dir listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes this as a safe non-mutating call, so the description's main addition is naming the categories of information returned. It offers no further behavioral context—no scope limits, cost, or staleness caveats—and an output schema already exists to describe the payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that names the return contents in order of importance, with no filler or redundancy. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema available to describe the returned payload and readOnlyHint covering the safety profile, the description is nearly sufficient for a trivial single-parameter read tool. It only falls short on when-to-use routing against sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 0% schema description coverage, so the description carries the burden of explaining project_path but says nothing about it. Because project_path is a largely self-evident identifier, this is an acceptable baseline but not compensating for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a clear verb with the resource and enumerates the three components returned (detected project type, key files, recent dir listing), which an agent can grasp immediately. It stops short of distinguishing itself from siblings like list_directory or get_config, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to reach for this tool versus alternatives such as list_directory, get_config, or get_logs. The agent is left to infer that 'project status' is a summary operation rather than a file listing or config fetch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

_substitute_varsA
Destructive

Replace {{key}} with variables[key] in text. Leaves {{key}} if key missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
variablesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds a genuinely useful behavioral detail beyond the annotation: unresolved {{key}} placeholders are left as-is rather than erroring or being blanked. Since the only annotation is destructiveHint=true, the description's disclosure of missing-key handling is valuable, but it says nothing about mutation semantics, error modes, or the destructive implication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core transformation and followed by the single most important edge case. Every clause earns its place with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter pure helper, the description covers the transformation and the fallback behavior, and an output schema exists so return format needn't be explained. Minor gaps around value types and quoting are tolerable given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must carry the parameter burden, and it does explain the key relationship: {{key}} in text maps to variables[key]. This clarifies the nested variables object's role as a string-to-string lookup, though it doesn't spell out edge cases like non-string values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Replace') and precisely states the transformation: substituting {{key}} placeholders with values from variables. This is unambiguous about what the tool does. It does not, however, differentiate itself from the sibling tools, which are all file/config/test operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, no preconditions, and no mention of the surrounding workflow (e.g., template rendering for configs or files). The behavior is described, but the context for invoking it is not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_configC
Destructive

Update name or version in pyproject.toml or package.json.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
valueYes
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint annotation already signals a mutating operation, and the description adds the useful scope constraint that only name/version fields in two specific manifest files are affected. It does not disclose in-place formatting preservation, whether changes are reversible, or permission requirements, so it adds only modest context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words; the target files are stated before anything else. It is appropriately sized for the operation, though extremely terse given the three undocumented parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and destructiveHint covers the safety profile. However, with 0% schema coverage the agent still cannot tell how project_path is resolved, whether both files may be passed, or what key values are legal, making the definition incomplete for a three-parameter mutating tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for three required parameters. It implies that 'key' should be name or version and that project_path points at a manifest file, but leaves 'value' format and the mismatch between the free-string key schema and the described name/version restriction unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Update') and names the exact resources ('name or version') and target files ('pyproject.toml or package.json'), which is narrower and more useful than the generic tool name update_config. It does not, however, explicitly distinguish itself from siblings like edit_file or write_file that could also modify these files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to choose this tool over the many file-modification siblings (edit_file, write_file, run_command) or over get_config for reads. Usage is only implied by the narrow scope of 'name or version', with no exclusions or preconditions given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_fileB
Destructive

Write or overwrite a file at path (relative to PROJECT_MCP_ROOT or cwd).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint annotation already declares this is a destructive operation, so the description is not carrying the safety burden alone. It does add value by noting the operation overwrites existing content and by defining path resolution (PROJECT_MCP_ROOT or cwd), but omits whether parent directories are created, encoding handling, and any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the verb, resource, and path-resolution caveat all earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the destructive annotation covers the safety profile. What remains missing is sibling differentiation from edit_file and side effects like parent-directory creation or partial-write failure behavior for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It usefully clarifies the path parameter's resolution rules but says nothing about content (encoding, whether it is raw text or a stringified payload), leaving one of two parameters undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (write/overwrite) and resource (file at path), which is unambiguous on its own. However, it does not distinguish itself from the sibling edit_file, which is the key routing decision an agent faces for this resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given, and no alternative is named. The choice between write_file and edit_file is left entirely to inference, even though 'overwrite' hints at full replacement behavior without saying when that is preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observed_substitute_vars
    • First observeddeploy
    • First observededit_file
    • First observedget_config
    • First observedget_logs
    • First observedlist_artifacts
    • First observedlist_directory
    • First observedread_file
    • First observedrun_command
    • First observedrun_tests
    • First observedsearch_files
    • First observedstatus
    • First observedupdate_config
    • First observedwrite_file

TDQS

B3.3/5.0

Scored across 14 tools

Disambiguation3/5

Several tools overlap in purpose: run_command can duplicate run_tests and deploy, read_file/get_config both read config files, edit_file/update_config can both modify config, and list_artifacts/list_directory/search_files share discovery space. Descriptions help, but an agent could plausibly misselect among these.

Naming Consistency4/5

Most tools follow a readable snake_case verb_noun pattern (read_file, write_file, get_config, update_config, run_tests). Minor deviations include _substitute_vars with a leading underscore, plus deploy and status as bare verb/noun names.

Tool Count5/5

14 tools is within the typical well-scoped range and matches a project lifecycle surface spanning files, config, tests, deployment, commands, status, and logs. No excessive proliferation or obvious under-provisioning.

Completeness4/5

Core project operations are covered: file read/write/list/search/edit, config get/update, test running, deployment, command execution, status, and logs. Minor gaps remain around explicit delete_file/create_directory and artifact lifecycle beyond listing, though run_command can work around many of them.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    FastMCP is a comprehensive MCP server allowing secure and standardized data and functionality exposure to LLM applications, offering resources, tools, and prompt management for efficient LLM interactions.
    3
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server built with FastMCP that enables dynamic tool loading and configuration from individual Python files. It provides a flexible framework for automatically discovering, testing, and running tools via Stdio or HTTP transport modes.
    1
    -
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A FastMCP server that exposes REST API endpoints as Model Context Protocol tools for AI agents. It provides a template for wrapping upstream APIs and includes deployment support for Docker and OpenShift.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    A FastMCP-based server that provides tools for API discovery and execution, hierarchical category management, and SQL query execution through the Model Context Protocol.
    -