Skip to main content
Glama
Partiri-Cloud

Partiri Cloud MCP Server

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

MCP_TRANSPORT=stdio or omit

HTTP

Remote access with OAuth 2.1

MCP_TRANSPORT=http

Related MCP server: paperclip-mcp

Quick Start

npm install
npm run build

stdio (local)

PARTIRI_API_KEY=your-key npx tsx src/index.ts

Or 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.ts

Then 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:

  1. PARTIRI_API_KEY environment variable

  2. ~/.config/partiri/key file (written by partiri auth)

  3. If the process is interactive (TTY attached and no CI environment detected), browserLogin() opens a browser and waits for the user to authorize

  4. Otherwise, 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:

  1. Client discovers endpoints via /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-authorization-server

  2. Client dynamically registers via POST /register

  3. The client opens /authorize, which redirects the browser to the hosted Partiri sign-in page (PARTIRI_WEB_URL/cli-auth) with a short state and the server's public callback URL

  4. After 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 API

  5. The 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

  6. All subsequent MCP requests use Authorization: Bearer <token>

Tokens are stateless &mdash; 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

PARTIRI_API_KEY

stdio only

&mdash;

API key for the Partiri REST API

PARTIRI_API_URL

No

https://api.partiri.cloud

Partiri API base URL (must be HTTPS)

PARTIRI_WEB_URL

No

https://partiri.cloud

Hosted Partiri web app URL (HTTP OAuth sign-in redirect)

PARTIRI_TIMEOUT

No

30

API request timeout in seconds

MCP_TRANSPORT

No

stdio

Transport mode: stdio or http

PORT

No

3000

HTTP server port

MCP_TOKEN_SECRET

HTTP prod

&mdash;

32-byte hex key (64 chars) for token encryption. Auto-generated in dev with a warning.

MCP_BASE_URL

HTTP prod

http://localhost:{PORT}

Public URL of the MCP server

MCP_DATA_DIR

No

&mdash;

Persistent dir for client registrations + token secret (survives restarts; single-replica)

MCP_ALLOWED_REDIRECT_HOSTS

No

&mdash;

Comma-separated OAuth redirect hosts allowed in addition to loopback

MCP_ALLOWED_ORIGINS

No

claude.ai, claude.com, chatgpt.com, chat.openai.com

Comma-separated browser Origins allowed on /mcp (own origin always included). Requests with any other Origin header get 403; requests without one (non-browser clients) always pass

MCP_TRUSTED_PROXIES

HTTP prod

loopback

Trusted proxy IP(s)/CIDR(s) for client-IP rate limiting; set to your ingress so X-Forwarded-For can't be spoofed

MCP_MAX_SESSIONS

No

1000

Max concurrent MCP sessions

MCP_MAX_SESSIONS_PER_KEY

No

5

Max sessions per API key

MCP_SESSION_TTL_MINUTES

No

30

Session inactivity timeout

MCP_READONLY

No

false

When truthy, only read-only tools are registered

MCP_TOOLS_ALLOWLIST

No

&mdash;

Comma-separated tool names to enable on top of the base set

MCP_TOOLS_DENYLIST

No

&mdash;

Comma-separated tool names to remove (wins over allowlist)

Available Tools

Tool

Description

list_workspaces

List all workspaces the user has access to

get_current_user

Get the authenticated user's profile

list_projects

List projects in a workspace

create_project

Create a new project

list_pods

List available compute pods (catalogue only; custom sizes are excluded)

list_regions

List available deployment regions

list_services

List services in a project

get_service

Get service details

create_service

Create a new service (webservice, static, private-service, worker, or cronjob)

update_service

Update service configuration

validate_service

Preflight-validate a service config; optionally probe repo/registry reachability (needs workspaceId)

deploy_service

Trigger a new deployment

pause_service

Pause a running service

unpause_service

Resume a paused service

list_jobs

List deployment jobs for a service

list_volumes

List persistent volumes in a project

get_volume

Get details of a single volume

get_cpu_metrics

Get CPU usage metrics

get_memory_metrics

Get memory usage metrics

get_network_metrics

Get network metrics

get_pricing

Get pod and volume pricing for a region (pass podIds to price a custom pod too)

get_custom_pod_options

Get the CPU/memory range, step grid, and rate card for a custom-sized pod

get_balance

Get a workspace's billing balance

use_partiri_cli

Advisory guidance for running the partiri CLI yourself for sensitive, CLI-only operations

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 variablespartiri service env; values hold secrets (DB URLs, API keys), so they are never read or written through the MCP — create_service/update_service don't accept env and get_service omits it

  • Volume lifecycle — create / attach / detach / delete / retry

  • Service teardownpartiri 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

  1. Add the API method to src/client.ts

  2. Add a tool definition and handler in the appropriate src/tools/<domain>.ts

  3. The tool is automatically registered via tools/index.ts aggregation

Deployment

For production behind a reverse proxy (Cloudflare, nginx):

  1. Set MCP_TRANSPORT=http

  2. Generate a stable token secret: openssl rand -hex 32

  3. Set MCP_TOKEN_SECRET to the generated value

  4. Set MCP_BASE_URL to the public URL (e.g. https://mcp.partiri.cloud)

  5. Set PARTIRI_API_URL if the API is not at the default https://api.partiri.cloud

  6. Set MCP_TRUSTED_PROXIES to your ingress/proxy IP or CIDR (e.g. 10.0.0.0/8)

  7. Deploy and expose port 3000 (or set PORT)

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_workspaceslist_projectslist_servicesget_serviceget_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_workspaceslist_projectslist_servicesdeploy_servicelist_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_workspaceslist_projectslist_serviceslist_podslist_regionscreate_service

Put a service in maintenance mode

"Enable maintenance mode on the checkout service while I push a hotfix."

Exercises: list_workspaceslist_projectslist_servicesupdate_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 tools
create_projectCreate ProjectA

Create a new project in a workspace. Returns the created project with its id. Get a workspace id from list_workspaces first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProject name
environmentYesEnvironment name (e.g. production, staging)
workspaceIdYesThe workspace UUID

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesService name (max 16 characters)
fkPodYesCompute pod UUID (use list_pods to find available pods)
runtimeYesApplication runtime
fkRegionYesRegion UUID (use list_regions to find available regions)
rootPathYesApplication root path in the repository
buildPathNoBuild output path
fkProjectYesProject UUID to create the service in
deployTypeYesDeployment type
runCommandNoCommand to start the service
registryUrlNoFull container image reference (e.g. `ghcr.io/owner/image:tag`). The API splits host, repository, and tag server-side.
buildCommandNoBuild command
repositoryUrlNoGit repository URL
fkServiceSecretNoRepository 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.
healthCheckPathNoHealth check endpoint path (GET)
preDeployCommandNoCommand to run before deployment
repositoryBranchNoGit branch to deploy from

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ServiceA
Destructive

Trigger a new deployment. Checks workspace balance and enforces a 10-minute cooldown. Use list_jobs to check deployment status afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceIdYesThe service UUID

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 BalanceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesThe workspace UUID

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MetricsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd timestamp (Unix seconds)
startNoStart timestamp (Unix seconds)
deployTagNoFilter by deployment tag
serviceIdYesThe service UUID

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 UserA
Read-onlyIdempotent

Get the profile of the currently authenticated user. Returns id, email, and name.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MetricsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd timestamp (Unix seconds)
startNoStart timestamp (Unix seconds)
deployTagNoFilter by deployment tag
serviceIdYesThe service UUID

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MetricsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd timestamp (Unix seconds)
startNoStart timestamp (Unix seconds)
deployTagNoFilter by deployment tag
serviceIdYesThe service UUID

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 PricingA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionIdYesThe region UUID

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ServiceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceIdYesThe service UUID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VolumeA
Read-onlyIdempotent

Get details of a single persistent volume by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
volumeIdYesThe volume UUID

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 JobsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceIdYesThe service UUID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PodsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesThe workspace UUID

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProjectsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesThe workspace UUID

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RegionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesThe workspace UUID

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ServicesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of services to return (default 50, max 200)
projectIdYesThe project UUID

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VolumesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project UUID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 WorkspacesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ServiceA
Idempotent

Pause a running service. The service will stop receiving traffic but can be unpaused later.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceIdYesThe service UUID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ServiceA
Idempotent

Resume a paused service.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceIdYesThe service UUID

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ServiceA
DestructiveIdempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoService name (max 16 characters)
fkPodNoCompute pod UUID to change the service to
runtimeNoApplication runtime
fkRegionNoRegion UUID to move the service to
rootPathNoApplication root path
buildPathNoBuild output path
serviceIdYesThe service UUID
deployTypeNoDeployment type
runCommandNoRun command
registryUrlNoFull container image reference (e.g. `ghcr.io/owner/image:tag`). The API splits host, repository, and tag server-side.
buildCommandNoBuild command
repositoryUrlNoGit repository URL
fkServiceSecretNoRepository or registry secret UUID
healthCheckPathNoHealth check endpoint path
maintenanceModeNoEnable/disable maintenance mode
preDeployCommandNoPre-deploy command
repositoryBranchNoGit branch

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 GuidanceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat you want to accomplish with the partiri CLI, e.g. "delete a service".
commandNoThe specific partiri CLI command to run, if known, e.g. "partiri service kill".

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ConfigurationA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesService name to validate
fkPodYesCompute pod UUID
runtimeYesApplication runtime
fkRegionYesRegion UUID
rootPathYesApplication root path
deployTypeYesDeployment type
diskSizeGbNoDisk size in GB for cost estimate (1–10)
runCommandNoRun command
registryUrlNoContainer image reference (mutually exclusive with repositoryUrl)
workspaceIdNoWorkspace UUID — used to check balance (billing:r permission required)
buildCommandNoBuild command
repositoryUrlNoGit repository URL (mutually exclusive with registryUrl)
fkServiceSecretNoService secret UUID for authenticated repository/registry access
repositoryBranchNoGit branch
probeReachabilityNoWhen true, probe the git repository or registry for reachability (probed whenever repositoryUrl or registryUrl is present)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 23 tool updatesv0.2.1
    • First observedcreate_project
    • First observedcreate_service
    • First observeddeploy_service
    • First observedget_balance
    • First observedget_cpu_metrics
    • First observedget_current_user
    • First observedget_memory_metrics
    • First observedget_network_metrics
    • First observedget_pricing
    • First observedget_service
    • First observedget_volume
    • First observedlist_jobs
    • First observedlist_pods
    • First observedlist_projects
    • First observedlist_regions
    • First observedlist_services
    • First observedlist_volumes
    • First observedlist_workspaces
    • First observedpause_service
    • First observedunpause_service
    • First observedupdate_service
    • First observeduse_partiri_cli
    • First observedvalidate_service

TDQS

A4.1/5.0

Scored across 23 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers