Partiri Cloud MCP Server
The Partiri Cloud MCP Server enables AI agents to manage cloud infrastructure on the Partiri PaaS platform, covering workspaces, projects, services, deployments, metrics, and billing.
User & Workspace Management
Retrieve the authenticated user's profile
List all workspaces the user has access to
Check a workspace's billing balance
Project Management
List projects within a workspace
Create new projects
Service Lifecycle Management
List, get details for, create, and update services
Preflight-validate service configurations before applying them
Deploy, pause, and unpause services
Deployments & Monitoring
List deployment jobs and track their status (open, in-progress, succeeded, failed, etc.)
Retrieve CPU, memory, and network usage metrics for services
Infrastructure & Pricing
Discover available compute pod types and deployment regions
Query pod and volume pricing for a region
Persistent Storage
List and get details for persistent volumes within a project
CLI Guidance
Get advisory instructions (not execution) for sensitive operations intentionally excluded from MCP tools — such as managing secrets, environment variables, volume lifecycle (create/detach/delete), and service teardown — to keep secrets out of the model context. These are handled via the local
partiriCLI.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Partiri Cloud MCP Servershow my active deployments"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Partiri Cloud MCP Server
MCP server for the Partiri Cloud PaaS platform. Allows AI agents (Claude Code, VS Code, etc.) to manage workspaces, projects, services, deployments, and metrics through the Model Context Protocol.
Transports
The server supports two transport modes:
Transport | Use case | Set via |
stdio (default) | Local CLI / direct integration |
|
HTTP | Remote access with OAuth 2.1 |
|
Related MCP server: paperclip-mcp
Quick Start
npm install
npm run buildstdio (local)
PARTIRI_API_KEY=your-key npx tsx src/index.tsOr point your MCP client at the built binary:
{
"partiri": {
"type": "stdio",
"command": "node",
"args": ["dist/index.mjs"],
"env": { "PARTIRI_API_KEY": "your-key" }
}
}HTTP (remote)
MCP_TRANSPORT=http \
MCP_TOKEN_SECRET=$(openssl rand -hex 32) \
MCP_BASE_URL=https://your-domain.com \
PORT=3000 \
npx tsx src/index.tsThen configure your MCP client:
{
"partiri": {
"type": "http",
"url": "https://your-domain.com/mcp"
}
}No API key in the config — the OAuth 2.1 browser flow handles authentication.
Authentication
stdio
The API key is resolved in order:
PARTIRI_API_KEYenvironment variable~/.config/partiri/keyfile (written bypartiri auth)If the process is interactive (TTY attached and no CI environment detected),
browserLogin()opens a browser and waits for the user to authorizeOtherwise, throws a descriptive error with a link to docs
Headless / CI usage: set PARTIRI_API_KEY. In CI or non-TTY contexts step 3 is skipped and the server fails fast with a clear error rather than hanging on a browser prompt.
HTTP (OAuth 2.1)
The HTTP transport implements a full OAuth 2.1 authorization server. When a client like Claude Code connects, the flow is:
Client discovers endpoints via
/.well-known/oauth-protected-resource/mcpand/.well-known/oauth-authorization-serverClient dynamically registers via
POST /registerThe client opens
/authorize, which redirects the browser to the hosted Partiri sign-in page (PARTIRI_WEB_URL/cli-auth) with a shortstateand the server's publiccallbackURLAfter the user confirms, the sign-in page mints a Partiri API key and redirects it back to the server's
GET /callback, which validates the key against the Partiri APIThe server issues an encrypted authorization code (bound to the client's PKCE challenge and redirect URI) and redirects to the client, which exchanges it for access/refresh tokens
All subsequent MCP requests use
Authorization: Bearer <token>
Tokens are stateless — the API key is AES-256-GCM encrypted inside the token itself. No token database is needed.
Legacy x-api-key header authentication is also supported for backward compatibility with curl and non-OAuth clients.
Resource binding (RFC 8707)
Issued tokens are audience-bound to this server's canonical resource, MCP_BASE_URL + /mcp (e.g. https://mcp.partiri.cloud/mcp). A resource parameter naming any other server is rejected with invalid_target, and an access token whose audience names another server fails verification. Tokens issued before this claim existed remain valid until their natural expiry and are upgraded to audience-bound tokens on their next refresh.
The protected-resource metadata (RFC 9728) is served at both /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-protected-resource, and every 401 carries a WWW-Authenticate header with a resource_metadata pointer so clients can discover the authorization server.
Environment Variables
Variable | Required | Default | Description |
| stdio only | — | API key for the Partiri REST API |
| No |
| Partiri API base URL (must be HTTPS) |
| No |
| Hosted Partiri web app URL (HTTP OAuth sign-in redirect) |
| No |
| API request timeout in seconds |
| No |
| Transport mode: |
| No |
| HTTP server port |
| HTTP prod | — | 32-byte hex key (64 chars) for token encryption. Auto-generated in dev with a warning. |
| HTTP prod |
| Public URL of the MCP server |
| No | — | Persistent dir for client registrations + token secret (survives restarts; single-replica) |
| No | — | Comma-separated OAuth redirect hosts allowed in addition to loopback |
| No | claude.ai, claude.com, chatgpt.com, chat.openai.com | Comma-separated browser Origins allowed on |
| HTTP prod |
| Trusted proxy IP(s)/CIDR(s) for client-IP rate limiting; set to your ingress so X-Forwarded-For can't be spoofed |
| No |
| Max concurrent MCP sessions |
| No |
| Max sessions per API key |
| No |
| Session inactivity timeout |
| No |
| When truthy, only read-only tools are registered |
| No | — | Comma-separated tool names to enable on top of the base set |
| No | — | Comma-separated tool names to remove (wins over allowlist) |
Available Tools
Tool | Description |
| List all workspaces the user has access to |
| Get the authenticated user's profile |
| List projects in a workspace |
| Create a new project |
| List available compute pods (catalogue only; custom sizes are excluded) |
| List available deployment regions |
| List services in a project |
| Get service details |
| Create a new service ( |
| Update service configuration |
| Preflight-validate a service config; optionally probe repo/registry reachability (needs |
| Trigger a new deployment |
| Pause a running service |
| Resume a paused service |
| List deployment jobs for a service |
| List persistent volumes in a project |
| Get details of a single volume |
| Get CPU usage metrics |
| Get memory usage metrics |
| Get network metrics |
| Get pod and volume pricing for a region (pass |
| Get the CPU/memory range, step grid, and rate card for a custom-sized pod |
| Get a workspace's billing balance |
| Advisory guidance for running the |
Deploy types and billing
Long-running types (webservice, static, private-service, worker) are billed a
flat monthly rate per pod, charged up front — total pods being replicaCount times
the number of regions.
A cronjob is metered instead: nothing is charged at creation, and each run is
debited on its actual duration (rounded up to the minute, 1-minute floor). An attached
volume is still charged a flat month on either model, so disk_monthly appears on both.
Cost objects returned by create_service and validate_service carry a billing_model
discriminator (flat_monthly or metered); update_service's cost_delta carries
current_billing_model and new_billing_model, so a delta stays meaningful across a
switch — converting a cronjob to a long-running type reports the full monthly charge it
starts paying, not zero. A cost object is omitted entirely when it cannot be computed;
absent means unknown, never free.
Suspending a recurring cronjob's schedule is done with pause_service /
unpause_service, not through update_service — the API owns that flag and keeps it in
step with the metered billing assignment.
CLI-only operations
To keep long-lived credentials out of the model context and irreversible
operations off the MCP surface, the following are not individual MCP tools.
You run them yourself with the locally-installed partiri CLI, which
authenticates independently of the MCP session. The use_partiri_cli tool does
not execute anything — it returns guidance for the command to run in your
own shell:
Workspace secrets — create / list / delete repository and registry secrets
Service environment variables —
partiri service env; values hold secrets (DB URLs, API keys), so they are never read or written through the MCP —create_service/update_servicedon't acceptenvandget_serviceomits itVolume lifecycle — create / attach / detach / delete / retry
Service teardown —
partiri service kill
Discover exact subcommands and flags at runtime (partiri llm guide,
partiri llm capabilities -j, or partiri <area> --help) rather than assuming
syntax. For credential values, pass them on stdin (e.g. --key-stdin) so they
stay out of the argument list and this context.
Project Structure
src/
index.ts Entry point (transport selection)
auth.ts API key resolution (env / file / browser login)
auth-login.ts Browser-based login flow for interactive stdio sessions
client.ts PartiriApiClient (HTTP, retry on 429)
server.ts MCP server creation, tool filtering, and tool registration
errors.ts Error formatting helpers
net-guard.ts SSRF / OAuth-redirect host classification (private/loopback/metadata)
http.ts HTTP transport (Express, OAuth, sessions)
oauth/
provider.ts OAuthServerProvider — authorize, token exchange, verification
client-store.ts Dynamic client registration (in-memory and file-backed)
crypto.ts AES-256-GCM token encryption/decryption
tools/
index.ts Tool aggregator
workspaces.ts Workspace tools
user.ts User tools
projects.ts Project tools
resources.ts Pod, region, pricing, custom-pod, and balance tools
cost.ts Shared cost math — decides flat monthly vs metered
service-rules.ts Shared create/validate rules (blocking vs advisory)
services.ts Service CRUD tools
validate.ts validate_service preflight tool (SSRF-guarded reachability probe)
deployments.ts Deploy, pause, unpause, and job-list tools
storage.ts Volume read tools (list_volumes, get_volume)
metrics.ts CPU, memory, network metrics tools
cli.ts use_partiri_cli advisory tool
resources/ Embedded MCP documentation resources
index.ts Resource registration
content/ Guides (getting started, services, deployments, …)Development
npm install
npm test # run tests (vitest)
npm run test:watch # watch mode
npm run dev # run with tsx (stdio)
npm run build # bundle to dist/Adding a New Tool
Add the API method to
src/client.tsAdd a tool definition and handler in the appropriate
src/tools/<domain>.tsThe tool is automatically registered via
tools/index.tsaggregation
Deployment
For production behind a reverse proxy (Cloudflare, nginx):
Set
MCP_TRANSPORT=httpGenerate a stable token secret:
openssl rand -hex 32Set
MCP_TOKEN_SECRETto the generated valueSet
MCP_BASE_URLto the public URL (e.g.https://mcp.partiri.cloud)Set
PARTIRI_API_URLif the API is not at the defaulthttps://api.partiri.cloudSet
MCP_TRUSTED_PROXIESto your ingress/proxy IP or CIDR (e.g.10.0.0.0/8)Deploy and expose port
3000(or setPORT)
Rate limiting keys on the client IP derived from X-Forwarded-For, which is only
trusted from the proxies named in MCP_TRUSTED_PROXIES (default: loopback only).
Set it to your real ingress range and ensure the proxy overwrites inbound
X-Forwarded-For — otherwise a client able to reach the server through a
trusted/loopback proxy could spoof its IP and bypass per-IP limits. The session
and client-registration stores are independently bounded (the API key is
validated before a session is created, and stores evict oldest-first), so
resource exhaustion and lockout are prevented even if IP limiting is
misconfigured.
Usage Examples
The following examples show realistic prompts an end user might give to an AI agent connected to this MCP server, and which tools each prompt exercises.
Inspect a service and check its resource usage
"Show me CPU and memory usage for my api service over the last hour."
Exercises: list_workspaces → list_projects → list_services → get_service → get_cpu_metrics, get_memory_metrics
Deploy a service and monitor progress
"Deploy the latest commit of the frontend service in my production project, then tell me when it succeeds."
Exercises: list_workspaces → list_projects → list_services → deploy_service → list_jobs
Create a new service from a Git repository
"List all services in my staging project and create a new Node.js web service from github.com/owner/repo on the main branch."
Exercises: list_workspaces → list_projects → list_services → list_pods → list_regions → create_service
Put a service in maintenance mode
"Enable maintenance mode on the checkout service while I push a hotfix."
Exercises: list_workspaces → list_projects → list_services → update_service
Support
For questions, bug reports, or integration help: support@partiri.cloud
Full documentation is available at https://partiri.cloud/documentation/mcp.
Privacy
This connector accesses workspace, project, service, deployment, log, and metrics data from your Partiri account on behalf of the authenticated user, and only that data. Secrets never reach the model context: environment variable values and secret references (env, fk_service_secret) are stripped from every tool response, and secret management is deliberately CLI-only. It does not maintain a token database — API keys are AES-256-GCM encrypted inside stateless OAuth tokens — and server-side session state is in-memory with a 30-minute inactivity TTL.
Privacy policy: https://partiri.cloud/privacy
Available Tools
23 toolscreate_projectCreate ProjectA
Create a new project in a workspace. Returns the created project with its id. Get a workspace id from list_workspaces first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name | |
| environment | Yes | Environment name (e.g. production, staging) | |
| workspaceId | Yes | The workspace UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no hints, but description discloses the creation action and return value. Does not cover potential side effects like duplicate handling, but sufficient for a simple create tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences—each adds essential information without redundancy. Front-loads the action and return, then prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description hints at return. With 3 well-documented params and sibling context, it's adequately complete for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by explaining how to obtain workspaceId, improving parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new project in a workspace' with a specific verb and resource. It distinguishes from sibling tools like create_service and list_projects, and mentions the return value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear prerequisite: 'Get a workspace id from list_workspaces first.' Does not specify when not to use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_serviceCreate ServiceA
Create a new service in a project. Requires exactly one source (repository URL or registry URL), a compute pod, and a region. Get IDs from list_projects, list_pods, and list_regions. Returns the created service with its id. Supported deploy types: webservice, static, private-service, worker (long-running background process with no inbound network — no port, no URL, no health check); for static the runtime is forced to "static" server-side. Environment variables are NOT set here — manage them with the partiri CLI (see use_partiri_cli).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Service name (max 16 characters) | |
| fkPod | Yes | Compute pod UUID (use list_pods to find available pods) | |
| runtime | Yes | Application runtime | |
| fkRegion | Yes | Region UUID (use list_regions to find available regions) | |
| rootPath | Yes | Application root path in the repository | |
| buildPath | No | Build output path | |
| fkProject | Yes | Project UUID to create the service in | |
| deployType | Yes | Deployment type | |
| runCommand | No | Command to start the service | |
| registryUrl | No | Full container image reference (e.g. `ghcr.io/owner/image:tag`). The API splits host, repository, and tag server-side. | |
| buildCommand | No | Build command | |
| repositoryUrl | No | Git repository URL | |
| fkServiceSecret | No | Repository or registry secret UUID. Secrets are managed outside the MCP (dashboard, or run the `partiri` CLI yourself — use_partiri_cli returns guidance); obtain the UUID there. | |
| healthCheckPath | No | Health check endpoint path (GET) | |
| preDeployCommand | No | Command to run before deployment | |
| repositoryBranch | No | Git branch to deploy from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes creation behavior ('Returns the created service with its id'), details deploy type nuances (e.g., 'worker: long-running background process with no inbound network — no port, no URL, no health check'), and notes server-side forced runtime for static. Annotations (readOnlyHint=false, destructiveHint=false) are consistent; description adds significant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence serves a purpose. It starts with the main action, then lists key constraints, followed by deploy type details and an important exclusion. Despite covering 16 parameters, it remains under 100 words and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 16 parameters, no output schema, and moderate complexity, the description covers: required inputs, source constraint, ID sources, deploy type semantics, env var handling, and return value. It fully equips an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by grouping concepts: 'Requires exactly one source (repository URL or registry URL)', clarifying deploy type behavior, and noting that secrets are managed externally. This offsets some schema verbosity, earning a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Create a new service in a project.', a specific verb+resource pair. It clearly differentiates from siblings like create_project or deploy_service by detailing the required components (source, pod, region). The scope and output are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Requires exactly one source (repository URL or registry URL)' and instructs to get IDs from list_projects, list_pods, list_regions. It provides a clear exclusion: 'Environment variables are NOT set here — manage them with the partiri CLI (see use_partiri_cli).' This perfectly guides when to use this tool vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_serviceDeploy ServiceADestructive
Trigger a new deployment. Checks workspace balance and enforces a 10-minute cooldown. Use list_jobs to check deployment status afterward.
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. The description adds valuable behavioral context: balance check and 10-minute cooldown. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter, no output schema, and annotations present, the description covers the core action, side effects, and follow-up. Minor gap: no mention of failure conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with descriptions; the tool description adds no additional parameter information beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool triggers a deployment, with specific verb 'Trigger' and resource 'deployment'. It mentions checks and cooldown, but does not explicitly differentiate from siblings beyond noting to check status via list_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for deploying services and suggests a follow-up action (list_jobs), but does not explicitly state when to use or not use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet Workspace BalanceARead-onlyIdempotent
Get the current workspace balance. Returns currency, amount, and last-updated timestamp. Requires billing:r permission — degrades gracefully (returns null) on a 403. Use this to warn the user before creating services.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | The workspace UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), the description adds permission requirement ('billing:r'), graceful degradation on 403 (returns null), and specific return fields. This provides valuable behavioral context annotations alone do not capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no redundant information. Every sentence adds essential value: function, return fields, permission/error behavior, and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 param, no output schema), the description covers all necessary information: purpose, return fields, permissions, error handling, and recommended usage. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter (workspaceId) is already well-documented in the schema with UUID format and description. At 100% schema description coverage, the description adds no additional semantics, so baseline score 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'current workspace balance', and the specific return fields (currency, amount, timestamp). No sibling tool retrieves balance, so it is well-distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends usage context ('warn the user before creating services') and notes permission requirements and graceful degradation. Lacks explicit when-not to use or alternatives, but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cpu_metricsGet CPU MetricsARead-onlyIdempotent
Get CPU usage metrics (average, peak, current in cores) for a service. Automatically uses the current deploy tag if not specified. Use get_service to find service IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End timestamp (Unix seconds) | |
| start | No | Start timestamp (Unix seconds) | |
| deployTag | No | Filter by deployment tag | |
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only, idempotent, non-destructive. Description adds automatic deploy tag fallback behavior, which is useful but not required beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, efficient with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no output schema but description gives reasonable context. Could be more explicit about return structure, but sufficient for a simple read metrics tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all 4 parameters (100% coverage). Description adds context about automatic deploy tag default, enhancing semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get CPU usage metrics' with specifics (average, peak, current in cores) and distinguishes from sibling tools like get_memory_metrics and get_network_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells when to use (get CPU metrics for a service), provides default behavior (auto-deploy tag), and directs to an alternative (use get_service to find service IDs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_userGet Current UserARead-onlyIdempotent
Get the profile of the currently authenticated user. Returns id, email, and name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, indicating a safe read operation. The description adds the return fields but does not disclose any additional behavioral traits (e.g., authentication requirements or rate limits). It is adequate but not enhanced beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 14 words, conveying all essential information without any superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with annotations covering safety, the description provides complete information: what it does and what it returns. No output schema needed given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so the description need not add parameter details. With 100% schema coverage (empty properties), a baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'profile of the currently authenticated user', and specifies the return fields (id, email, name). It distinguishes itself from sibling tools which are unrelated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use to retrieve current user info. No explicit alternatives or exclusions are needed, but the description could add a note about when to prefer this over other tools. Still, the name and description make it obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memory_metricsGet Memory MetricsARead-onlyIdempotent
Get memory usage metrics (average, peak, current in bytes) for a service. Automatically uses the current deploy tag if not specified. Use get_service to find service IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End timestamp (Unix seconds) | |
| start | No | Start timestamp (Unix seconds) | |
| deployTag | No | Filter by deployment tag | |
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral context beyond annotations: automatic use of current deploy tag if not specified. With strong annotations (readOnlyHint=true, idempotentHint=true), description's additions are valuable but concise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with core purpose. Every word earns its place; no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description fully explains output format and default behavior. Also provides cross-reference to get_service for discovering service IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. Description does not enhance parameter meaning beyond schema, though it notes deployTag defaults to current tag. No additional constraints or side effects explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get memory usage metrics' with specific output fields (average, peak, current in bytes). Differentiates from sibling tools like get_cpu_metrics and get_network_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on deployTag defaulting to current tag and directs users to get_service for finding service IDs. Lacks explicit when-not-to-use but sufficient for typical usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_metricsGet Network MetricsARead-onlyIdempotent
Get network download and upload metrics (bytes/s) for a service. Automatically uses the current deploy tag if not specified. Use get_service to find service IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End timestamp (Unix seconds) | |
| start | No | Start timestamp (Unix seconds) | |
| deployTag | No | Filter by deployment tag | |
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. Description adds value by revealing the automatic deploy tag fallback behavior, which is not in annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and provide actionable guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficiently covers the tool's purpose, parameter behavior, and sibling reference. With no output schema and good annotations, the description is adequate, though it could elaborate on the exact metric units or time range handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds meaning by explaining the deployTag parameter's default behavior (automatic use of current tag), which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves network download/upload metrics for a service. It distinguishes from siblings like get_cpu_metrics and get_memory_metrics by specifying the metric type, though could more directly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes automatic deploy tag default and recommends get_service for finding service IDs. Provides clear context for when to use this tool, though does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingGet PricingARead-onlyIdempotent
Get pod and volume pricing for a region. Returns pod prices (monthly, per-minute) and volume price per GB per month. Use a region id from list_regions. Useful for estimating monthly cost before creating a service.
| Name | Required | Description | Default |
|---|---|---|---|
| regionId | Yes | The region UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, destructiveHint) already indicate safety. The description adds specific return details: pod prices (monthly, per-minute) and volume price per GB per month, which is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no wasted words. Efficiently covers what, returns, and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter and annotations present, the description adequately explains the return values (pod pricing breakdown, volume price). No output schema, but description sufficiently covers expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter (regionId) with format UUID. The description adds guidance to use an ID from list_regions, providing extra meaning beyond the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets pod and volume pricing for a region, specifying the action and resource. It distinguishes from siblings, which include tools like create_project, get_service, etc., none of which focus on pricing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It advises to use a region id from list_regions and mentions the use case of estimating cost before creating a service. This provides clear context, though it doesn't explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_serviceGet ServiceARead-onlyIdempotent
Get full configuration of a service including repository, build commands, region, pod, and deploy tag. Environment variables are omitted from the response — they hold secrets and are managed out-of-band via the partiri CLI (see use_partiri_cli). Use list_services to find service IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosures that environment variables are omitted from the response due to security, which adds transparency beyond annotations. Matches safe read-only behavior indicated by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first explains what it does, second adds usage guidance. No superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one parameter, description covers included fields and omitted ones. Lacks mention of return format but outputs are likely the configuration object; acceptable without output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (serviceId) with full schema coverage; description adds minimal value by connecting it to list_services, but does not elaborate on format or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Get' and resource 'full configuration of a service' with specific fields like repository, build commands, region, etc. Differentiates from sibling 'list_services' which only returns IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly guides to use 'list_services' for finding service IDs and mentions that environment variables are managed via partiri CLI (use_partiri_cli). Provides clear context for when to use alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_volumeGet VolumeARead-onlyIdempotent
Get details of a single persistent volume by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| volumeId | Yes | The volume UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent. Description adds no new behavioral context beyond 'Get details'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a simple read tool with full annotations and clear schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameter fully with format and description. Description merely reinforces the ID nature.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states action (get), resource (persistent volume), and identifier (by ID). Distinguishes from list_volumes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly clear for single-item retrieval. Does not explicitly exclude alternatives, but context signals suffice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsList Deployment JobsARead-onlyIdempotent
List deployment jobs for a service. Returns job id, type, status (open, in_progress, succeeded, failed, canceled, timed_out), and timestamps. Use after deploy_service to track progress.
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by detailing the returned fields and statuses, and stating it is for tracking progress. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and outputs, followed by a usage hint. No wasted words, very efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one parameter and no output schema, the description covers functionality, return info, and usage context. It lacks notes on pagination or ordering, but these are not critical given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with serviceId described as 'The service UUID'. The description does not add extra meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'List' and resource 'deployment jobs for a service'. It specifies the returned fields (id, type, status, timestamps), making the purpose unambiguous. It differentiates from sibling list tools by tying to service context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool after 'deploy_service' to track progress, providing clear context. No exclusions or alternatives are mentioned, but the guidance is sufficient for a simple list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_podsList Compute PodsARead-onlyIdempotent
List available compute pods (instance types) for a workspace. Returns id, name, label, cpu, and ram for each pod. Use a pod id when creating a service with create_service.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | The workspace UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds information about returned fields (id, name, label, cpu, ram) but does not disclose additional behavioral traits such as pagination or rate limits. Since annotations cover the safety profile, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (three sentences) and front-loaded with purpose. Every sentence adds value: purpose, return fields, and usage linkage. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description adequately covers purpose, return fields, and practical usage (linking to create_service). It is complete for the agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the workspaceId parameter already described as 'The workspace UUID'. The description does not add any new parameter semantics beyond the schema, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'available compute pods (instance types) for a workspace', and lists returned fields (id, name, label, cpu, ram). It distinguishes itself from siblings by being the only tool that lists compute pods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs using a pod id with 'create_service', linking the output to a downstream action. It clearly states the use case (needing pod id) but does not mention when not to use or alternatives, which are not needed as there are no similar sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList ProjectsARead-onlyIdempotent
List all projects in a workspace. Returns id, name, and environment for each project. Get a workspace id from list_workspaces first. Use a project id with list_services.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | The workspace UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as readOnly, idempotent, and non-destructive. The description adds the specific return fields (id, name, environment), providing additional context beyond annotations. There are no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each serving a clear purpose: stating the action and output, and providing workflow guidance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter, no output schema), the description is complete: it explains what it does, what it returns, prerequisites, and how to use the result with another tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not add significant meaning beyond what the schema already provides. The description does not elaborate on the parameter beyond its existence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all projects in a workspace and specifies the returned fields (id, name, environment). It distinguishes itself from siblings like list_workspaces and list_services by mentioning workspace and project IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit prerequisite 'Get a workspace id from list_workspaces first' and suggests a next step 'Use a project id with list_services'. This guides the agent on when to use this tool and how to use its output, though it does not explicitly mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_regionsList RegionsARead-onlyIdempotent
List available deployment regions for a workspace. Returns id, name, label, and country_code for each region. Use a region id when creating a service with create_service.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | The workspace UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds limited new behavioral insight beyond listing returned fields. No contradictions are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no waste. The first sentence states the purpose, and the second provides usage guidance. Information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (one parameter, no output schema), the description fully covers the purpose, return values, and usage context. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'workspaceId', which is well-described in the schema. The description does not add additional meaning beyond what the schema provides, so baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List available deployment regions for a workspace', specifying the verb (List), resource (regions), and scope (for a workspace). It also lists returned fields and connects usage to create_service, distinguishing the tool from other list tools among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Use a region id when creating a service with create_service', providing clear context for when to use the tool. Although it doesn't explicitly mention when not to use it, the guidance is specific and actionable for the primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesList ServicesARead-onlyIdempotent
List all services in a project. Returns a summary (id, name, runtime, deploy_type, deploy_tag, active) for each service — call get_service for full configuration. Get a project id from list_projects first. Returns at most limit services (default 50); when has_more is true, raise limit to fetch the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of services to return (default 50, max 200) | |
| projectId | Yes | The project UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, idempotent, non-destructive; description adds pagination behavior (has_more means need to raise limit) and return summary fields, enhancing understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with main action, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains return fields and pagination; mentions prerequisite (list_projects); sibling tools are relevant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions (100% coverage); description adds default limit value and pagination context beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all services in a project' and specifies the returned fields, distinguishing it from get_service which provides full configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisite (list_projects to get project id) and explains pagination with limit and has_more, though no explicit when-not-to-use is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_volumesList VolumesARead-onlyIdempotent
List persistent volumes in a project. Returns id, name, size, mount_path, status, and attached service for each volume. Status can be: pending, provisioning, available, attached, deleting, or failed.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The project UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safety (readOnly, idempotent, non-destructive). Description adds value by specifying exact return fields and statuses, which helps set expectations. No mention of pagination or ordering, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with action and result. No redundant words. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return fields and statuses. Minor gap: no mention of pagination or limits, but acceptable for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter projectId is fully described in the schema (UUID, required). Description does not add new meaning beyond the schema. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists persistent volumes in a project and enumerates returned fields (id, name, size, mount_path, status, attached service) and possible statuses. This distinguishes it from sibling tools like get_volume (single volume) or list_projects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides clear context for listing volumes but does not explicitly state when to use this tool vs alternatives (e.g., get_volume for a single volume). No exclusion criteria or alternative hints are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyIdempotent
List all workspaces the authenticated user has access to. Returns id, name, and email for each workspace. Use a workspace id with list_projects, list_pods, or list_regions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. The description adds transparent details: returns id, name, email, and lists all workspaces the authenticated user has access to. No behavioral contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second provides return fields and usage hint. No wasted words, front-loaded with key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, clear annotations, simple output), the description fully covers necessary context. Return fields are specified, and usage guidance is provided for integration with siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters; baseline 4 applies. The description adds value by clarifying the authentication context and return structure, though no parameter specifics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'list', the resource 'workspaces', and scope 'the authenticated user has access to'. It specifies return fields and distinguishes its role by mentioning usage of the workspace id with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to use the returned workspace id with list_projects, list_pods, or list_regions, indicating when to chain this tool. It lacks explicit 'when not to use', but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_servicePause ServiceAIdempotent
Pause a running service. The service will stop receiving traffic but can be unpaused later.
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotence and non-destructiveness. The description adds value by stating the service stops receiving traffic and can be unpaused, providing practical behavioral context not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler words. Purpose and key behavioral info are front-loaded, making it efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pause tool with one parameter and no output schema, the description covers the essential aspects: what it does, the effect on traffic, and reversibility. Minor gap: no mention of billing or state implications, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the parameter 'serviceId' described as 'The service UUID'. The description does not add any additional meaning beyond the schema, earning the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource ('Pause a running service'), clearly stating the action. It distinguishes itself from sibling tools like unpause_service and deploy_service by specifying its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (for a running service that should be temporarily unavailable) and notes it can be unpaused later. However, it does not explicitly mention when not to use or provide alternatives beyond the implicit unpause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpause_serviceUnpause ServiceAIdempotent
Resume a paused service.
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | The service UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false; the description adds no further behavioral context beyond stating the action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words, though it is slightly terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity and annotation coverage, the description is minimally sufficient but lacks optional context such as prerequisites or behavior on already-running services.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds no additional meaning to the single parameter beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Resume a paused service' uses a specific verb and clearly identifies the resource, distinguishing it from sibling 'pause_service'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a service is paused but provides no explicit guidance on when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_serviceUpdate ServiceADestructiveIdempotent
Update an existing service configuration. Only include fields you want to change. Use get_service to see current values first. Environment variables are NOT managed here — use the partiri CLI (see use_partiri_cli).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Service name (max 16 characters) | |
| fkPod | No | Compute pod UUID to change the service to | |
| runtime | No | Application runtime | |
| fkRegion | No | Region UUID to move the service to | |
| rootPath | No | Application root path | |
| buildPath | No | Build output path | |
| serviceId | Yes | The service UUID | |
| deployType | No | Deployment type | |
| runCommand | No | Run command | |
| registryUrl | No | Full container image reference (e.g. `ghcr.io/owner/image:tag`). The API splits host, repository, and tag server-side. | |
| buildCommand | No | Build command | |
| repositoryUrl | No | Git repository URL | |
| fkServiceSecret | No | Repository or registry secret UUID | |
| healthCheckPath | No | Health check endpoint path | |
| maintenanceMode | No | Enable/disable maintenance mode | |
| preDeployCommand | No | Pre-deploy command | |
| repositoryBranch | No | Git branch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and idempotentHint=true. The description adds that only included fields are changed (partial update), which is consistent. It also discloses that env vars are not managed, adding context beyond annotations. Could mention potential side effects like redeployment, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences. First sentence states purpose, second gives usage hint, third provides exclusion and alternative. No redundancy, every sentence serves a purpose. Front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 17 parameters and no output schema, the description covers key usage patterns and exclusions. It tells how to use (get current first, partial update) and what not to do (env vars). Could mention what the response looks like or success indicators, but it's fairly complete for an update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the partial update pattern ('Only include fields you want to change') and clarifying that environment variables are not handled in this tool, which guides parameter usage. This exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing service configuration ('Update an existing service configuration'), uses a specific verb ('Update'), and distinguishes from siblings like create_service and deploy_service by focusing on existing resources. It also implies a partial update pattern ('Only include fields you want to change').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: 'Use get_service to see current values first' tells when to use before update. Exclusion: 'Environment variables are NOT managed here — use the partiri CLI (see use_partiri_cli)' clearly states when not to use and points to an alternative sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_partiri_cliGet Partiri CLI GuidanceARead-onlyIdempotent
Guidance for running the locally-installed partiri CLI yourself for sensitive operations that are intentionally not exposed as direct MCP tools: managing workspace secrets (partiri secret create-repository / create-registry), detaching or deleting a volume (partiri storage detach / delete), killing a service (partiri service kill), and managing service environment variables (partiri service env). This tool does NOT execute anything — it returns instructions for you to run the command in your own shell. These operations are kept CLI-only because they pass long-lived credentials or cause irreversible data loss, and the CLI authenticates independently of the MCP session. Note: creating, attaching, or retry-provisioning a volume has no CLI subcommand — use the dashboard or API. Service-scoped commands like service kill read the service ID from a local .partiri.jsonc (only service deploy accepts --service <UUID>). Discover exact subcommands and flags at runtime — run partiri llm guide, partiri llm capabilities -j, or partiri <area> --help first; do not assume command syntax. For credential values prefer stdin (with the CLI flag that reads stdin, e.g. --token-stdin / --password-stdin) over an argument so the secret stays out of the command line and this context.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What you want to accomplish with the partiri CLI, e.g. "delete a service". | |
| command | No | The specific partiri CLI command to run, if known, e.g. "partiri service kill". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool returns instructions, does not execute anything, and explains why (long-lived credentials, irreversible data loss, independent auth). Adds context about service-scoped commands reading service ID from local file. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured and front-loaded with the core purpose. Each sentence adds necessary context. Minor verbosity in listing all operations but overall efficient for the detail provided.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity, no output schema, and rich annotations, the description covers usage guidelines, alternatives, caveats, discovery instructions, and best practices. It is fully adequate for an agent to decide when and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by explaining the purpose of each parameter, e.g., 'action' describes what to accomplish, 'command' provides an optional specific command. Gives examples and best practices for stdin usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides guidance for running CLI commands for sensitive operations, not executing them. It lists specific CLI subcommands and distinguishes itself from sibling tools by explaining these operations are intentionally not direct MCP tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (for sensitive CLI-only operations) and when not to (e.g., creating/attaching a volume uses dashboard/API). Provides alternatives like using the dashboard or API. Also advises to discover command syntax via runtime help commands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_serviceValidate Service ConfigurationAIdempotent
Preflight-validate a service configuration before creating or updating it. Checks source XOR rule (repository vs registry), deploy_type/runtime compatibility, and name length (≤16). When probeReachability is set, performs an OUTBOUND network probe of the supplied git repository or registry URL (not side-effect-free). Returns a list of checks with ok/fail status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Service name to validate | |
| fkPod | Yes | Compute pod UUID | |
| runtime | Yes | Application runtime | |
| fkRegion | Yes | Region UUID | |
| rootPath | Yes | Application root path | |
| deployType | Yes | Deployment type | |
| diskSizeGb | No | Disk size in GB for cost estimate (1–10) | |
| runCommand | No | Run command | |
| registryUrl | No | Container image reference (mutually exclusive with repositoryUrl) | |
| workspaceId | No | Workspace UUID — used to check balance (billing:r permission required) | |
| buildCommand | No | Build command | |
| repositoryUrl | No | Git repository URL (mutually exclusive with registryUrl) | |
| fkServiceSecret | No | Service secret UUID for authenticated repository/registry access | |
| repositoryBranch | No | Git branch | |
| probeReachability | No | When true, probe the git repository or registry for reachability (probed whenever repositoryUrl or registryUrl is present) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds key behavioral details beyond annotations: it discloses the network probe side effect ('not side-effect-free') when probeReachability is set, and explains the checks performed. Annotations already indicate idempotence and non-destructive nature; the description enriches the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences) and front-loaded: first sentence states purpose and main checks, second covers the special probe behavior, third summarizes output. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior and key constraints. It lacks details on required permissions (e.g., for workspaceId) and does not describe the exact output format beyond 'list of checks with ok/fail status,' but given the absence of an output schema and the richness of annotations, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 15 parameters, so the baseline is 3. The description adds meaning by explaining the XOR rule for repositoryUrl/registryUrl and noting the probeReachability side effect, which goes beyond the schema's individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Preflight-validate a service configuration before creating or updating it.' It lists specific validations (source XOR rule, deploy_type/runtime compatibility, name length) and distinguishes from siblings that create or update services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool 'before creating or updating it,' providing clear usage context. It does not explicitly list when not to use or name alternatives, but the purpose is well-defined enough for an agent to decide.
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.
23 tool updates
v0.2.1- First observed
create_project - First observed
create_service - First observed
deploy_service - First observed
get_balance - First observed
get_cpu_metrics - First observed
get_current_user - First observed
get_memory_metrics - First observed
get_network_metrics - First observed
get_pricing - First observed
get_service - First observed
get_volume - First observed
list_jobs - First observed
list_pods - First observed
list_projects - First observed
list_regions - First observed
list_services - First observed
list_volumes - First observed
list_workspaces - First observed
pause_service - First observed
unpause_service - First observed
update_service - First observed
use_partiri_cli - First observed
validate_service
TDQS
Scored across 23 tools
Each tool targets a distinct resource or action: create, deploy, metrics, pricing, etc. No two tools have overlapping purposes. Even similar get_/list_ tools separate singular vs plural and target different entities.
All tools follow a consistent verb_noun pattern in snake_case. Verbs are imperative (create, get, list, pause, etc.) and nouns are clear, even for compound terms like cpu_metrics. No mixing of styles.
23 tools cover a cloud platform's essential operations (workspaces, projects, services, volumes, metrics, pricing) without being overwhelming. Each tool earns its place; no obvious bloat.
Service lifecycle is mostly covered (create, get, list, update, deploy, pause/unpause, validate, metrics) but missing delete operation and environment variable management (delegated to CLI). Volumes lack CRUD entirely. Projects and workspaces have only read or create. These gaps are notable but the core workflow for services is functional.
Maintenance
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP-first control plane for ProAgentStore agents and private instances.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for hyperpanes terminal workspace app, enabling AI agents to compose and launch workspace layouts, inspect and drive terminal panes, stream output, and orchestrate agent hierarchies.471MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for the Paperclip AI agent orchestration API, enabling management of AI companies, agents, projects, and tasks through any MCP-compatible client.16 npm4MIT
- FlicenseNot gradedqualityBmaintenanceMCP server for AI DevTool workflow, exposing tools and resources for code review, repository chat, and repository operations.1-
- AlicenseAqualityBmaintenanceMCP server for Azure resource management, AI Foundry, and Entra ID — inspect and operate Azure infrastructure through AI agents.3MIT