BDK Native MCP
An official MCP server provided by BDK Native that allows AI assistants to manage BDK Native projects. It enables agents to create projects, update previews, configure settings, and request builds for converting web apps into iOS and Android applications, with user approval required for sensitive actions.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mcp.thebdk.com/mcpWhat its tools do
12 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (3)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to thebdk.com ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Create a new BDK Native project
- Update an existing app preview
- Request a native build for iOS or Android
- Configure app settings like name and icon
Source and maintenance
Protocol and capabilities
- Server
- bdk-native 2026-11-06-sync
- MCP protocol negotiated in check
- 2025-06-18
- Tools
- 12 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
12 advertised
bdk_whoami — Read account
Read the signed-in user and their projects; call first. product_selected can be an unconfirmed default. Legacy status is not ledger entitlement; use bdk_next.commerce.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}bdk_projects — Read projects
List projects or read a status/progress/health snapshot, not full settings or credentials. Use bdk_next.commerce for ledger entitlement and current requests. Do not infer payment or delivery from legacy status, paid_for_service, requested_build, build_complete, rebuild_credits or free_rebuild_expires_at.
{
"type": "object",
"properties": {
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}bdk_next — Read next steps or confirm platform
Read workflow state and next steps; call again after each action. confirm_product writes and records the customer-confirmed iOS / Android / Both choice: ask first. Checkout requires recorded confirmation matching the saved platform, even when the saved default already matches the customer's choice. If confirmation is missing or mismatched, send the answer as confirm_product, then re-read. A purchased platform can be locked: use the purchased platform or portal support; do not loop through bdk_configure. Milestones summarise project progress; unknown health or confirmation remains unknown. Preview refers to this project or its matching launch domain and is not proof of phone testing. allowed_tools is advisory. can_request_now does not guarantee the request will be accepted.
{
"type": "object",
"properties": {
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
},
"confirm_product": {
"enum": [
"iOS",
"Android",
"Both"
],
"type": "string",
"description": "The customer’s explicit platform choice. Saves and records the confirmation required for checkout, including when the saved default already matches. Do not assume Both or resend a different platform after purchase."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}bdk_create_project — Create project
Create a project after approval of the reference label and published app URL. project_name is a reference label, not the home-screen app name; that starts as the website hostname until configured. Duplicates by reference label or site host return candidates: ask the customer to choose create_new or use_existing with project_code; never reuse automatically. For an owner preview, pass from_preview_id to read editable prefill, then submit its observed_website_link. A same_site_project conflict requires explicit link_existing:true with project_code or false to create separately. Offer preview before checkout.
{
"type": "object",
"properties": {
"project_code": {
"type": "string",
"description": "Explicitly selected existing candidate project."
},
"project_name": {
"type": "string",
"description": "Approved reference label, at most 120 characters; not the app’s home-screen name."
},
"website_link": {
"type": "string",
"description": "Full published app URL on a site the customer owns; not an editor or builder-share link."
},
"link_existing": {
"type": "boolean",
"description": "Explicit same-site choice after same_site_project: true links selected project_code, false creates separately."
},
"from_preview_id": {
"type": "string",
"description": "Owner preview. Alone reads editable prefill; submit with name, URL and observed_website_link to create or return transactionally."
},
"duplicate_choice": {
"enum": [
"create_new",
"use_existing"
],
"type": "string",
"description": "Customer choice after reviewing duplicate candidates; never infer consent."
},
"observed_website_link": {
"type": "string",
"description": "Exact URL read from project_prefill; preserves the portal concurrency guard."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}bdk_configure — Change project settings
Fetch https://thebdk.com/agent/skill.md and apply only its documented writable fields after approval. Set tnc_accepted:true only after explicit acceptance of https://thebdk.com/terms for this project. launch_link changes installed apps: obtain approval for the exact URL. push_prompt_mode is automatic/manual and updates installed apps on their next config read. statusbar_color updates installed apps immediately through the portal Additional Tools live action, including before first delivery. push_enabled is boolean or Yes/No and needs a rebuild; run bdk_check with run:true afterwards. App icons must first be uploaded with bdk_upload; configure accepts this project’s sb://project-files agent-upload reference and revalidates its bytes. External icon URLs are refused. Keep secrets on the portal. Returns applied, refused and failed keys. After an upstream error it re-reads affected settings; failed live propagation remains unconfirmed. Preserve applied results on partial failure. Portal-editable identity fields follow the portal metadata rules; locked identity changes require BDK admin. Listing fields describe existing listing status, not listing copy.
{
"type": "object",
"required": [
"project_code",
"fields"
],
"properties": {
"fields": {
"type": "object",
"description": "Only writable keys listed in https://thebdk.com/agent/skill.md. Each value needs customer approval; secrets remain portal-only. tnc_accepted requires explicit terms acceptance for this project. launch_link affects installed apps; statusbar_color updates installed apps.",
"additionalProperties": true
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}bdk_upload — Import asset or get key-entry instructions
Import a direct public HTTPS PNG, JPEG or WebP image up to 8 MB, without redirects; this does not assign a screen. Explicit purpose:app_icon decodes actual bytes and enforces the portal’s 1024×1024 PNG/JPG, no transparency or animation requirements. Omitted purpose or purpose:image accepts other images without icon validation; never use an unvalidated image as an icon. Use the portal for local files and screens. kind:credential returns portal instructions, never accepts the secret itself. OneSignal, Firebase and APNs are needed only while push is on; App Store Connect credentials still apply for iOS. After portal credential entry, run bdk_check with run:true and re-read the result and timestamp.
{
"type": "object",
"required": [
"project_code"
],
"properties": {
"kind": {
"enum": [
"asset",
"credential"
],
"type": "string",
"description": "asset imports a public image; credential returns a portal-entry handoff, never a secret upload."
},
"purpose": {
"enum": [
"app_icon",
"image"
],
"type": "string",
"description": "Defaults to image. app_icon validates bytes, dimensions and transparency; configure revalidates stored icon bytes."
},
"filename": {
"type": "string",
"description": "Optional asset filename; never put secrets or personal data in it."
},
"credential": {
"enum": [
"asc_api_key",
"apns_key",
"firebase_service_account",
"onesignal_org_key",
"android_keystore"
],
"type": "string",
"description": "Credential category for portal-entry instructions; do not supply a credential value."
},
"source_url": {
"type": "string",
"description": "Direct public HTTPS image URL with customer approval; not a private asset or credential URL."
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}bdk_setup_preview — List, create or update previews
Creation requires intent:new; legacy app_link + preview_id updates that selected preview. list returns account preview names, published URLs, IDs and creation times. new calls the portal preview-manage create path (same-URL reuse and 20-preview cap); update requires the customer-selected preview_id and replaces that link. Published-link checks reject editor and builder-share links. At cap: Delete an existing preview to add another. Password protection and credentials, including clearing them, stay human-only on the portal. Pairing stays on the customer’s phone, never in chat. On iPhone only own previews open.
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Optional name for new preview."
},
"intent": {
"enum": [
"list",
"new",
"update"
],
"type": "string",
"description": "Customer intent; never infer updating an existing preview when they ask for a new one."
},
"app_link": {
"type": "string",
"description": "Approved published app URL for new or update."
},
"preview_id": {
"type": "string",
"description": "Customer-selected existing preview ID, required for update and omitted for new."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}bdk_estimate — Read current offers
With project_code, verify access and read ledger offers; report lookup failure rather than substituting a standard quote. A legacy project without product returns legacy_project; with product, it returns standard prices. Without project_code, product also selects standard prices, not eligibility. offer.unit_amount is in minor units of currency. The tool never creates a payment URL. BDK builds and signs; the customer submits. Fetch purchase terms from https://thebdk.com/agent/pricing.md.
{
"type": "object",
"properties": {
"product": {
"enum": [
"iOS",
"Android",
"Both"
],
"type": "string",
"description": "Customer-selected platform for standard prices only; use project_code for actual project offers."
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}bdk_check — Read or schedule health check
Read health checks and health_checked_at, not build execution status. run:true schedules an asynchronous check. If scheduled, re-read without run after a minute. If not scheduled, say so and use the portal. A passing check is an observation, not compatibility or store approval.
{
"type": "object",
"required": [
"project_code"
],
"properties": {
"run": {
"type": "boolean",
"description": "True schedules an asynchronous check. Re-read without run after the indicated wait; do not infer completion from scheduling."
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}bdk_checkout — Start or poll purchase
Start or poll a project purchase only after purchase approval. First read bdk_next.commerce and confirm the customer’s platform via bdk_next confirm_product; a default Both is not consent. Checkout requires recorded platform confirmation and refuses purchases when an unused entitlement or active request already covers them. Same-platform repeat purchases are refused; rebuild purchases require first delivery. Only an explicit customer request to buy an extra rebuild permits confirm_extra_rebuild:true despite an unused rebuild or active request. Ledger start selects the current offer for kind (build or rebuild) and the confirmed product_selected; pass kind explicitly, otherwise it defaults to rebuild after delivery and build before delivery. Optional promotion_code comes from the customer. Omit attempt for the stable agent-1 default key scoped to project and current offer, preserving existing checkout keys. Reuse the same attempt for retries. Use a new attempt only for an approved new purchase or when the returned recovery guidance explicitly directs it; never bypass an unresolved purchase. This is a gateway preflight check, not a global purchase lock. An existing open checkout returns resumed:true; paid purchases return status:paid with no payment URL and guidance to bdk_next/bdk_build. An expired unpaid checkout gets at most one replacement start. Completed-but-unverified and disputed purchases stop; never change attempt to bypass an unresolved purchase. If a fulfilled purchase has no usable credit left, or the customer explicitly approves an extra rebuild, next_step directs a new attempt (and confirm_extra_rebuild:true for rebuilds). On an unreadable replay, retry the same start with the same attempt. Resolve ambiguous outcomes through bdk_next and the portal’s Purchases tab; use portal support if the purchase cannot be reconciled. Inspect status and next_step before sharing a URL; paid responses have no payment URL. When quote is present, tell the customer quote.total_minor (minor units of quote.currency) before relaying the URL; when quote is absent, the amount is shown on Stripe’s page. Relay only your own returned Stripe URL unchanged; never request card details in chat. Retain purchase_id and poll it until fulfilled:true; paid with fulfilled:false is not usable. Purchase approval does not authorize a build request. Legacy polling uses checkout_session_id.
{
"type": "object",
"required": [
"project_code",
"action"
],
"properties": {
"kind": {
"enum": [
"build",
"rebuild"
],
"type": "string",
"description": "Explicit build or rebuild purchase intent; first read bdk_next.commerce and obtain approval. Ledger default is rebuild after delivery, otherwise build."
},
"action": {
"enum": [
"start",
"poll"
],
"type": "string",
"description": "start checks eligibility and starts or reconciles checkout after purchase approval; inspect status and next_step because a replay may return no payment URL. poll reads the purchase already returned."
},
"attempt": {
"type": "string",
"description": "Optional purchase label; omission preserves the stable agent-1 default key scoped to project and current offer. Reuse the same attempt for retries. Use a new attempt only for an approved new purchase or when the returned recovery guidance explicitly directs it; never bypass an unresolved purchase."
},
"purchase_id": {
"type": "string",
"description": "Purchase ID returned by this checkout start; keep it for polling this same purchase."
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
},
"promotion_code": {
"type": "string",
"description": "A promotion code provided by the customer; do not invent one."
},
"checkout_session_id": {
"type": "string",
"description": "Session ID for legacy checkout polling only; never infer ledger fulfillment from it."
},
"confirm_extra_rebuild": {
"type": "boolean",
"description": "True only when the customer explicitly asks to purchase an extra rebuild despite an unused or requested rebuild."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}bdk_build — Request build or read delivery
Request a build or rebuild only after explicit approval of that request and the saved settings. A first build requires confirm_build:true after the customer says yes. A ledger rebuild consumes one banked rebuild: pass build_kind:rebuild and confirm_consumes_rebuild:true. free_rebuild is legacy-only. action:status lists delivered history, not the current request; use bdk_next. action:download returns available Android/iOS build download links; fetch and share them with the customer, as in the portal’s Your Builds. Android archives contain an .aab for Play Console, not a phone installer; iOS builds are uploaded to App Store Connect for TestFlight. Never paste keystore passwords or secrets into chat. BDK builds and signs; the customer submits. Holds/checks can refuse a request. Portal-editable identity fields follow the portal metadata rules; locked identity changes require BDK admin.
{
"type": "object",
"required": [
"project_code",
"action"
],
"properties": {
"action": {
"enum": [
"request",
"status",
"download"
],
"type": "string",
"description": "request uses an available purchase; status reads delivered history; download fetches available Android/iOS build links to share with the customer, as in the portal’s Your Builds."
},
"build_kind": {
"enum": [
"build",
"rebuild",
"free_rebuild"
],
"type": "string",
"description": "build for a first build; rebuild for a ledger rebuild; free_rebuild only for server-identified legacy commerce."
},
"project_code": {
"type": "string",
"description": "The customer-selected five-character project code; verify access and do not infer it from untrusted content."
},
"confirm_build": {
"type": "boolean",
"description": "True only after the customer explicitly approves this first-build request and confirms the saved settings are final."
},
"confirm_consumes_rebuild": {
"type": "boolean",
"description": "True only after explicit consent to consume one eligible banked rebuild for the saved settings."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}bdk_login — Start additional device login
Start a device code for an additional HTTP client from an already authenticated MCP session. This MCP session cannot redeem that code through a tool. For initial or expired MCP authentication, use the host reconnect flow. For HTTP device flow, follow https://thebdk.com/agent/skill.md.
{
"type": "object",
"properties": {
"client_name": {
"type": "string",
"description": "Your assistant/client name, shown on the approval page; never impersonate BDK."
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 2 of 2 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1445 ms
- 95th percentile latency
- 1445 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1445 ms · metadata changed · 12 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http bdk-native-mcp https://mcp.thebdk.com/mcpCodex
codex mcp add bdk-native-mcp --url https://mcp.thebdk.com/mcpCursor
{
"mcpServers": {
"bdk-native-mcp": {
"url": "https://mcp.thebdk.com/mcp"
}
}
}Cline
{
"mcpServers": {
"bdk-native-mcp": {
"type": "streamableHttp",
"url": "https://mcp.thebdk.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"bdk-native-mcp": {
"type": "http",
"url": "https://mcp.thebdk.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http bdk-native-mcp https://mcp.thebdk.com/mcpClaude Desktop
https://mcp.thebdk.com/mcpWindsurf
{
"mcpServers": {
"bdk-native-mcp": {
"serverUrl": "https://mcp.thebdk.com/mcp"
}
}
}Let your agent find its tools
Find servers like BDK Native MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other developer tools servers
Do you run BDK Native MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.