Northflank MCP by usefulapi

Inspect and control your Northflank projects, services, jobs, and builds from your AI assistant.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
95%
Naming quality
78%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'northflank_create_combined_service' name length outside 3-30 rangein northflank_create_combined_service
  • LOWTool 'northflank_trigger_service_build' name length outside 3-30 rangein northflank_trigger_service_build

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,805Tokens (tool definitions)
~2.0 KBTypical response size
Significant attention impact (3.75% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "northflank": {
      "url": "https://northflank.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://northflank.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢northflank_list_repositories(teamId, accountLogin, per_page, page, cursor)

List GitHub repositories accessible through Northflank's linked GitHub accounts, with repository URLs and account logins for northflank_create_combined_service. Does not connect a new GitHub account. GET /v1/integrations/vcs/repos.

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "description": "Team id, required for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "accountLogin": {
      "description": "Filter by the linked GitHub account login.",
      "type": "string",
      "minLength": 1
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_plans

List Northflank deployment plan IDs, CPU, RAM and vendor prices. Choose an explicit deploymentPlan for northflank_create_combined_service; these are Northflank infrastructure charges, separate from UsefulAPI. GET /v1/plans.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_create_combined_service(projectId, teamId, name, repositoryUrl, branch, ...)

MUTATING: create a combined service that builds a connected GitHub repository and deploys it. May incur Northflank build/compute charges and expose the selected HTTP port publicly. Confirm the repository, branch, plan, port and inherited-secret access with the user, then pass confirm=true. Supply absolute Dockerfile/context paths. environmentSecretReferences maps runtime variable names to existing inherited variable NAMES (for example DATABASE_URL: DB_CONNECTION becomes ${DB_CONNECTION}); never supply secret values. Secret groups must already apply to this service through project scope, existing tags or stageId. This tool does not change secret-group restrictions. A successful creation is not proof of a successful build or healthy deployment: inspect the service and build history. Never blindly retry an uncertain creation; list services first. POST /v1/projects/{projectId}/services/combined.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$",
      "description": "Existing project id."
    },
    "teamId": {
      "description": "Team id, required for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "name": {
      "type": "string",
      "minLength": 3,
      "maxLength": 54,
      "pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$",
      "description": "New service name."
    },
    "repositoryUrl": {
      "type": "string",
      "pattern": "^https:\\/\\/github\\.com\\/[A-Za-z0-9_-]+\\/[A-Za-z0-9_.-]+$",
      "description": "HTTPS GitHub repository URL from northflank_list_repositories, without a trailing slash, query or credentials."
    },
    "branch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "pattern": "^[^\\s\\x00-\\x1f\\x7f]+$",
      "description": "Explicit Git branch to build."
    },
    "accountLogin": {
      "description": "Linked GitHub account login from northflank_list_repositories; useful when multiple accounts are linked.",
      "type": "string",
      "minLength": 1
    },
    "dockerfilePath": {
      "type": "string",
      "pattern": "^\\/((?!\\.\\.?\\/)[a-zA-Z0-9-._]+\\/)*(?!\\.\\.?$)[a-zA-Z0-9-._]+$",
      "description": "Absolute repository path to the Dockerfile, e.g. /Dockerfile or /apps/api/Dockerfile."
    },
    "dockerWorkDir": {
      "default": "/",
      "description": "Absolute repository build context; defaults to /.",
      "type": "string",
      "pattern": "^\\/((?!\\.\\.?\\/)[a-zA-Z0-9-._]+\\/)*(?!\\.\\.?$)[a-zA-Z0-9-._]*$"
    },
    "deploymentPlan": {
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$",
      "description": "Explicit deployment plan ID from northflank_list_plans; charged by Northflank."
    },
    "buildPlan": {
      "description": "Optional Northflank build plan ID; omitted uses the vendor default.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "instances": {
      "default": 1,
      "description": "Initial running replicas, charged by Northflank.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "httpPort": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535,
      "description": "Container HTTP listen port. The application must listen on 0.0.0.0."
    },
    "public": {
      "type": "boolean",
      "description": "Explicitly choose whether the HTTP port is publicly accessible."
    },
    "healthCheck": {
      "description": "Optional HTTP health check on the container's HTTP port.",
      "type": "object",
      "properties": {
        "path": {
          "type": "string",
          "pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$",
          "description": "HTTP health endpoint on httpPort, e.g. /health."
        },
        "type": {
          "default": "readinessProbe",
          "type": "string",
          "enum": [
            "readinessProbe",
            "livenessProbe",
            "startupProbe"
          ]
        },
        "initialDelaySeconds": {
          "default": 10,
          "type": "integer",
          "minimum": 1,
          "maximum": 1800
        },
        "periodSeconds": {
          "default": 30,
          "type": "integer",
          "minimum": 10,
          "maximum": 600
        },
        "timeoutSeconds": {
          "default": 5,
          "type": "integer",
          "minimum": 1,
          "maximum": 60
        },
        "failureThreshold": {
          "default": 3,
          "type": "integer",
          "minimum": 1,
          "maximum": 255
        }
      },
      "required": [
        "path"
      ],
      "additionalProperties": false
    },
    "environmentSecretReferences": {
      "description": "Runtime variable name -> existing inherited variable name; values are NAMES, never credentials. Source variables must already be inherited from applicable runtime secret groups. Avoid mapping a name to itself: inherited variables already exist.",
      "type": "object",
      "propertyNames": {
        "type": "string",
        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
      },
      "additionalProperties": {
        "type": "string",
        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
      }
    },
    "tags": {
      "description": "Previously defined resource tags, including any tags required to inherit the intended secret groups.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 3,
        "maxLength": 100,
        "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
      }
    },
    "stageId": {
      "description": "Existing project environment/stage id for stage-scoped secret inheritance.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Required: user approved creating the service, its charges, public exposure and inherited-secret access."
    }
  },
  "required": [
    "projectId",
    "name",
    "repositoryUrl",
    "branch",
    "dockerfilePath",
    "deploymentPlan",
    "httpPort",
    "public",
    "confirm"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_projects(teamId, per_page, page, cursor)

List projects for the authenticated token (or a specific team). Good first call to discover project ids. GET /v1/projects (team: GET /v1/teams/{teamId}/projects).

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "description": "Optional team id to scope to a team's projects.",
      "type": "string"
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_get_project(projectId)

Get details of a single project, including region, cluster and associated services/jobs/addons. GET /v1/projects/{projectId}.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id (from northflank_list_projects)."
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_services(projectId, teamId, per_page, page, cursor)

List services in a project (build / deployment / combined) with their build+deployment status. GET /v1/projects/{projectId}/services.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "teamId": {
      "description": "Team id for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_get_service(projectId, teamId, serviceId)

Get details and current status of a single service. GET /v1/projects/{projectId}/services/{serviceId}.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "teamId": {
      "description": "Team id for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "serviceId": {
      "type": "string",
      "description": "Service id (from northflank_list_services)."
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_jobs(projectId, per_page, page, cursor)

List jobs (manual / cron) in a project. GET /v1/projects/{projectId}/jobs.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_get_job(projectId, jobId)

Get details of a single job, including build/deploy config and cron schedule. GET /v1/projects/{projectId}/jobs/{jobId}.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "jobId": {
      "type": "string",
      "description": "Job id (from northflank_list_jobs)."
    }
  },
  "required": [
    "projectId",
    "jobId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_addons(projectId, per_page, page, cursor)

List addons (managed databases / services) in a project with their status. GET /v1/projects/{projectId}/addons.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_get_addon(projectId, addonId)

Get details and status of a single addon. GET /v1/projects/{projectId}/addons/{addonId}.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "addonId": {
      "type": "string",
      "description": "Addon id (from northflank_list_addons)."
    }
  },
  "required": [
    "projectId",
    "addonId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_service_builds(projectId, teamId, serviceId, per_page, page, ...)

List a build service's build runs / history (branch, sha, status, timestamps). GET /v1/projects/{projectId}/services/{serviceId}/build.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "teamId": {
      "description": "Team id for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "serviceId": {
      "type": "string",
      "description": "Service id of a build/combined service."
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_get_service_metrics(projectId, serviceId, queryType, metricTypes, duration, ...)

Get CPU / memory metrics for a service's containers. GET /v1/projects/{projectId}/services/{serviceId}/metrics. Use queryType=single (default) for a current snapshot or queryType=range with duration/startTime/endTime.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Service id."
    },
    "queryType": {
      "description": "single = point-in-time (default), range = time series.",
      "type": "string",
      "enum": [
        "single",
        "range"
      ]
    },
    "metricTypes": {
      "description": "Which metrics to return; defaults to all if omitted.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "cpu",
          "memory"
        ]
      }
    },
    "duration": {
      "description": "Range duration in seconds (alternative to startTime/endTime).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "startTime": {
      "description": "Range start (unix ms/seconds per API).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "endTime": {
      "description": "Range end.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "time": {
      "description": "Point-in-time for queryType=single.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_secret_groups(projectId, teamId, per_page, page, cursor)

List a project's secret groups — METADATA ONLY (id, name, type, priority, restrictions). Does NOT return secret values. GET /v1/projects/{projectId}/secrets.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "teamId": {
      "description": "Team id for an organization-scoped token.",
      "type": "string",
      "minLength": 3,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢northflank_list_domains(teamId, per_page, page, cursor)

List custom domains for the account (or a team), with verification status. GET /v1/domains (team: GET /v1/teams/{teamId}/domains).

Input Schema

{
  "type": "object",
  "properties": {
    "teamId": {
      "description": "Optional team id to scope to a team's domains.",
      "type": "string"
    },
    "per_page": {
      "description": "Results per page (max 100).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    },
    "page": {
      "description": "Page number to access.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Cursor from a previous page's pagination.cursor to fetch the next page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_trigger_service_build(projectId, serviceId, branch, sha, pullRequestId)

MUTATING: start a new build for a build/combined service. With an empty body it builds the latest commit on the linked branch; optionally target a branch, a specific commit sha, or a pull request. POST /v1/projects/{projectId}/services/{serviceId}/build.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Build/combined service id."
    },
    "branch": {
      "description": "Branch to build (defaults to the service's linked branch).",
      "type": "string"
    },
    "sha": {
      "description": "Specific commit SHA to build from the branch.",
      "type": "string"
    },
    "pullRequestId": {
      "description": "Build the latest commit of this pull request's branch.",
      "type": "string"
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_restart_service(projectId, serviceId)

MUTATING: restart all running containers of a service. POST /v1/projects/{projectId}/services/{serviceId}/restart.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Service id."
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_scale_service(projectId, serviceId, instances)

MUTATING: set the number of running instances (replicas) for a service. POST /v1/projects/{projectId}/services/{serviceId}/scale.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Service id."
    },
    "instances": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Desired number of instances / replicas."
    }
  },
  "required": [
    "projectId",
    "serviceId",
    "instances"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_pause_service(projectId, serviceId)

MUTATING: pause a service, scaling it to zero running instances. POST /v1/projects/{projectId}/services/{serviceId}/pause.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Service id."
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴northflank_resume_service(projectId, serviceId, instances, disabledCI, disabledCD, ...)

MUTATING: resume a paused service. Optionally set the instance count and CI/CD/autoscaling state to restore. POST /v1/projects/{projectId}/services/{serviceId}/resume.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project id."
    },
    "serviceId": {
      "type": "string",
      "description": "Service id."
    },
    "instances": {
      "description": "Instances to scale to on resume.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "disabledCI": {
      "description": "Whether CI should be disabled after resume.",
      "type": "boolean"
    },
    "disabledCD": {
      "description": "Whether CD should be disabled after resume.",
      "type": "boolean"
    },
    "enableAutoscaling": {
      "description": "Restore autoscaling (defaults to the state captured when paused).",
      "type": "boolean"
    }
  },
  "required": [
    "projectId",
    "serviceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools