Northflank MCP by usefulapi
Inspect and control your Northflank projects, services, jobs, and builds from your AI assistant.
Should I use this
Quality & Safety
Findings (2)
- LOWin northflank_create_combined_service
- LOWin northflank_trigger_service_build
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (20)
🟢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
Evidence