Menu

Quick Start

Create an MCP server from a YAML declaration in under 5 minutes.

Time to complete: ~5 minutes. You’ll have a running MCP server connected to Claude Desktop.

What you’ll build

A Sentry MCP server that lets Claude list issues and resolve them in your Sentry account. The same pattern works for any API.

Prerequisites

Node.js 18+ or Python 3.10+. If you need Node.js: nodejs.org.

Install

Node.js:

npm install -g usepaso

Python:

pip install usepaso

Verify:

usepaso --version

Create a declaration

usepaso init --name "Sentry"

This creates a usepaso.yaml in the current directory. Edit it to describe your API:

version: "1.0"

service:
  name: Sentry                        # Human-readable service name
  description: Error monitoring and performance tracking for software teams
  base_url: https://sentry.io/api/0   # All paths are relative to this
  auth:
    type: bearer                      # paso forwards USEPASO_AUTH_TOKEN as Bearer header

capabilities:
  - name: list_issues
    description: List issues in a project
    method: GET
    path: /projects/{organization_slug}/{project_slug}/issues/
    permission: read
    inputs:
      organization_slug:
        type: string
        required: true
        description: Organization slug
        in: path
      project_slug:
        type: string
        required: true
        description: Project slug
        in: path
      query:
        type: string
        description: "Search query (e.g., 'is:unresolved')"
        in: query

  - name: resolve_issue
    description: Mark an issue as resolved
    method: PUT
    path: /issues/{issue_id}/
    permission: write                # Groups this under the "write" permission set
    consent_required: true           # Agent must get user approval before calling
    inputs:
      issue_id:
        type: string
        required: true
        description: The issue ID
        in: path
      status:
        type: enum
        required: true
        values: [resolved, unresolved, ignored]
        description: New status for the issue

permissions:
  read:
    - list_issues
  write:
    - resolve_issue

Validate

usepaso validate

See all validation flags in the CLI reference.

valid (Sentry, 2 capabilities, 0 regrets)

:::tip[Something wrong?] Run usepaso doctor for a full diagnostic. It checks your file, YAML syntax, auth token, and API connectivity in one command. :::

Test

Try a capability before going live:

usepaso test list_issues --dry-run
--- DRY RUN (no request will be made) ---

GET https://sentry.io/api/0/projects/{organization_slug}/{project_slug}/issues/
Authorization: Bearer ...

Remove --dry-run to send the real request (requires USEPASO_AUTH_TOKEN). See the testing guide for more patterns.

Serve

export USEPASO_AUTH_TOKEN="your-sentry-token"
usepaso serve
usepaso serving "Sentry" (2 capabilities). Agents welcome.

Your API is now accessible to MCP clients.

Connect to Claude Desktop

One command. paso writes the config for you.

usepaso connect claude-desktop
Added "Sentry" in Claude Desktop config.
  Config: ~/Library/Application Support/Claude/claude_desktop_config.json

Restart Claude Desktop to connect.

Restart Claude Desktop. Your capabilities appear as tools.

Also works with Cursor, VS Code, and Windsurf. Replace claude-desktop with cursor, vscode, or windsurf.

:::note[Why not just write an MCP server directly?] You can. The MCP SDK is well-documented. You can get a basic server running in an afternoon.

But paso handles protocol compliance, request routing, auth forwarding, input validation, and error handling from a single YAML file. When the next protocol arrives, your declaration doesn’t change. :::

You’re live.

Your API is agent-ready. Open Claude Desktop and try: “List my Sentry issues.” Claude calls your MCP server, hits the Sentry API, and returns the results. That’s the whole loop.

You went from zero to a working MCP server in under 5 minutes. The same pattern works for any REST API.

Next, you might want to:

From the blog: