{"data":{"name":"com.finalpos/final","title":"Final POS – Custom POS Builder","description":"Build custom POS apps with any AI agent: checkout flows, kiosks, payment terminals. Plus store ops.","version":"2.0.1","websiteUrl":"https://finalpos.com/mcp","repositoryUrl":"https://github.com/Final-Commerce/final-pos-mcp","remotes":[{"url":"https://ai.finalpos.com/mcp","type":"streamable-http","headers":[{"name":"Authorization","isSecret":true,"description":"Optional. Clients with OAuth 2.1 sign in with Final and need no header. Otherwise: Bearer fai_... connection key from https://ai.finalpos.com/connections"}]}],"packages":[],"status":"active","isLatest":true,"publishedAt":"2026-10-18T15:49:47.968Z","updatedAt":"2026-10-18T15:49:47.968Z","source":"official-registry","verification":"official","confidence":100,"stars":null,"sources":[{"stars":null,"title":"Final POS – Custom POS Builder","source":"official-registry","sourceId":"com.finalpos/final","updatedAt":"2026-10-18T15:49:47.968Z","confidence":100,"websiteUrl":"https://finalpos.com/mcp","description":"Build custom POS apps with any AI agent: checkout flows, kiosks, payment terminals. Plus store ops.","verification":"official","repositoryUrl":"https://github.com/Final-Commerce/final-pos-mcp"}],"toolIndex":{"tools":[{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"ask_finai","title":"Ask Finai","description":"Hand a task in words to Finai, Final's own AI agent, and get its finished answer. It runs as this connection's user on its company, within the allowed packs, and uses Final's tools itself (looking records up, creating products, building or deploying an app). Use it for multi-step merchant jobs you would rather describe than orchestrate; call tools directly when you need the raw data. Pass conversationId to continue an earlier thread.","inputSchema":{"type":"object","properties":{"task":{"type":"string","minLength":1,"maxLength":4000,"description":"What to do or find out, in plain language, with every id or value Finai needs."},"conversationId":{"type":"string","description":"A conversationId from an earlier ask_finai result, to continue that thread."}},"required":["task"],"additionalProperties":false},"annotations":{"title":"Ask Finai","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"definitionHash":"f51cf63ff7aa541eb90eb8269b96ef9ba1661976299718878d82a44760e1b2e3","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"call_tool","title":"Run a read-only tool","description":"Run a read-only tool from any allowed pack by its full name (for example hub_find_low_stock) without it being listed. Only tools that read are accepted; tools that change data run through call_write_tool. Arguments follow that tool's own input schema, which find_tools returns.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The tool's gateway name, e.g. hub_get_products or flow_list_flows."},"arguments":{"type":"object","description":"The tool's arguments.","additionalProperties":true}},"required":["name"],"additionalProperties":false},"annotations":{"title":"Run a read-only tool","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"95d68efdc56f42f5453eb2f990c326231846a2b4a5017f4325728ac0db538dbc","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"call_write_tool","title":"Run a tool that changes data","description":"Run a tool that creates, changes, deletes, sends or deploys from any allowed pack by its full name (for example hub_update_product) without it being listed. Only tools find_tools marks as writes are accepted; read-only tools run through call_tool. Arguments follow that tool's own input schema, which find_tools returns.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The tool's gateway name, e.g. hub_update_product or flow_deploy_flow."},"arguments":{"type":"object","description":"The tool's arguments.","additionalProperties":true}},"required":["name"],"additionalProperties":false},"annotations":{"title":"Run a tool that changes data","readOnlyHint":false,"destructiveHint":true,"openWorldHint":true},"definitionHash":"ca6158538affe8e225bfb90d7485a57c4a02d9e66c5a8fdacb6c3e52c5c65722","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"disable_packs","title":"List fewer packs","description":"Remove packs from tools/list for this connection to keep the list short. Tools stay reachable through call_tool and call_write_tool.","inputSchema":{"type":"object","properties":{"packs":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["packs"],"additionalProperties":false},"annotations":{"title":"List fewer packs","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"483a6a402b61c13a2d2b1a56a0bf7aa961e10241c09d6fa9420a76de8b8f7a7e","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"enable_packs","title":"List more packs","description":"Add packs to tools/list for this connection (remembered). Only allowed packs can be listed; the client refreshes its tool list.","inputSchema":{"type":"object","properties":{"packs":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Pack ids from list_packs."}},"required":["packs"],"additionalProperties":false},"annotations":{"title":"List more packs","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"bcb38a08ac6c82fda17568a0e8ab3406a9f7f5eae884277f9b67ece82c179ceb","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"find_tools","title":"Find tools","description":"Search every allowed pack for tools by what you want to do (\"low stock\", \"create a product\", \"deploy the app\"). Returns matching tool names with their pack, whether they are listed and whether they change data. Run a read-only match with call_tool and a write with call_write_tool, or enable_packs to list its pack.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Plain-language description of the task or the record type."},"limit":{"type":"integer","minimum":1,"maximum":40,"default":12}},"required":["query"],"additionalProperties":false},"annotations":{"title":"Find tools","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"e43bd2519495e6dd8ad4df820df37a6da14f510accff1f31edc9fdc19207f753","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_apply_blueprint_widgets","title":"Apply blueprint widgets into a flow","description":"COPY vetted blueprint widgets into a flow as real files — byte-exact, no transcription. Pass picks of { blueprintId, widgetId } (from list_blueprints / search_blueprints); the widget files land under src/widgets/<blueprint>/ with their command-frame plumbing intact, persisted as a restorable checkpoint + builder-chat note like write_flow_files. Returns a manifest (paths, export names, props, a ready-to-paste import block) — never the code. Compose your screens by importing the manifest paths; adapt an applied widget with a small write_flow_files edit, never a wholesale rewrite, and never re-type code from get_blueprint. A selfPersisting blueprint's copied code reads/writes its OWN custom tables by exact name: this tool PROVISIONS those tables into your organization automatically, possibly under org-scoped names (see `tables` in the result — the copied code already uses the final names) — never create them yourself and never create a lookalike. Tables owned by a platform extension are reported under `extensionTables` (with extensionIds when pinned): only installing that extension provides them (install_extension, with user consent). Secrets the code reads are reported under `secrets` — each missing key gets a fill-in request in the builder automatically; values never travel over MCP. Re-applying a pick restores the widget's vetted contents.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"picks":{"minItems":1,"type":"array","items":{"type":"object","properties":{"blueprintId":{"type":"string"},"widgetId":{"type":"string"}},"required":["blueprintId","widgetId"]}},"note":{"description":"One-line summary of the change, shown in the builder chat.","type":"string"},"agent":{"type":"string"},"hubToken":{"description":"Optional organization JWT for the Final hub, used to provision the blueprint's custom tables when your organization has no stored hub credential.","type":"string"}},"required":["flowId","picks"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Apply blueprint widgets into a flow","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"definitionHash":"d296b45d77c2b8c8ee28293e82c832213fb605a7610c174c2ba6027d29b4fbd1","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_apply_upstream_update","title":"Apply an upstream update to a clone","description":"Apply the update reviewed with get_upstream_update. Pass resolutions: exactly one entry per conflict — { path, contents } with the COMPLETE merged file, or { path, delete: true } when the file should not exist. Missing, unknown or ambiguous entries fail the whole call with nothing written (the plan is recomputed here, so re-review if the flow changed since). What it does, in order: saves the current files as a restorable \"Before update\" checkpoint, lands the merged tree (an open builder tab picks it up safely), records an \"Update from upstream vX\" checkpoint narrated in the builder chat, re-stamps the clone's update pointer so the next check compares against this release, provisions custom tables the update introduced (org-scoped names — the merged code already uses them), and raises a fill-in request for each missing secret (values never travel over MCP). If the review said adoptMode: true, call with adopt: true and NO resolutions to replace the files with the original's latest release wholesale — undoable via the safety checkpoint; confirm with your user first.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"resolutions":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"contents":{"description":"The complete merged file for this conflict.","type":"string"},"delete":{"description":"True when the file should not exist after the update.","type":"boolean"}},"required":["path"]}},"adopt":{"description":"Only when the review reported adoptMode: true — replace the flow's files with the original's latest release wholesale.","type":"boolean"},"note":{"description":"One-line summary for the builder chat.","type":"string"},"agent":{"type":"string"},"hubToken":{"type":"string"}},"required":["flowId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Apply an upstream update to a clone","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"definitionHash":"5baaa132eda4dccd3a0b9ac818b7b72ebe92a02be2f35ad986841d987748c2df","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_connect_chat","title":"Connect to an existing flow","description":"Attach this agent session to an EXISTING flow as a chat in the builder's rail (so the flow's owner sees your work alongside their own chats). Also use log_message to narrate what you're doing.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"agent":{"type":"string"}},"required":["flowId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Connect to an existing flow","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"definitionHash":"dfcc09216ebe6a1b0ecb591a7db4fd1b0f743bc15c75e9ccf6d0ec6a0c111593","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_create_custom_table","title":"Create a custom data table","description":"Create a new custom data table (schema: name + typed columns) in your Final organization. USE THIS for any data the app must keep — loyalty stamps, waitlists, bookings, inventory logs, settings: the platform syncs the table to every station running the flow and keeps it working offline at the POS, so it replaces ANY browser-storage or hand-rolled persistence (localStorage/IndexedDB are forbidden and fail validate_flow). NEVER store credentials in a table — that's what the secrets vault (request_secret) is for. This creates the table IMMEDIATELY and ORG-WIDE (visible to every station and every flow, not just this one), so unless the user actually asked for stored data, confirm before creating; creation can also be plan-gated — surface a plan/permission error to the user rather than retrying. Check list_custom_tables first to reuse an existing table, and search_blueprints before building functionality around a new one: a selfPersisting blueprint brings its OWN tables by exact name and apply_blueprint_widgets provisions them for you, so a lookalike would sit dead while the feature keeps reading the real one. Create tables only for net-new data no applied blueprint persists. The name is normalized to kebab-case; generated code reads/writes rows via renderClient.getCustomTableData / upsertCustomTableData.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"Table name; normalized to a kebab-case id, e.g. 'gift-cards'."},"description":{"type":"string"},"fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Column name."},"type":{"type":"string","enum":["string","number","boolean","date","json-string"]},"required":{"type":"boolean"},"defaultValue":{"type":"string"},"referenceLinkedCollection":{"description":"Foreign-key target collection (e.g. another custom table's kebab-case name).","type":"string"},"referenceLinkedField":{"description":"Foreign-key target field within that collection.","type":"string"}},"required":["name","type"]}},"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"required":["name","fields"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Create a custom data table","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"definitionHash":"8466473d1dfbc048eb11b09b2cee6f896106be14a4e70166dd32b2fa5d072539","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_create_flow","title":"Create a new flow","description":"Create a new, empty flow (app build) in your Final organization for YOU to write the app into. It appears in the Miami builder immediately, with this agent session attached as a chat. Optional theme knobs seed the live palette. Optional `device` (\"mobile\", \"kiosk\", \"iphone\", …) sets the preview frame it opens in; see set_flow_device. Returns the flow id and a builder deep link. Call get_scaffold before writing files. For an app the user merely DESCRIBED, use start_build.","inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120},"agent":{"description":"Display name for this tool in the builder chat rail, e.g. 'Claude Code'.","type":"string"},"device":{"description":"Default preview device for the new flow (the frame the builder opens it in). Omit for the user's Settings default.","anyOf":[{"type":"string","minLength":1,"maxLength":64,"description":"A device word: a surface (desktop, tablet, mobile, kiosk, kitchen-display, menu-board, drive-thru), a get_scaffold profile (portrait-handheld, counter-tablet, wall-kiosk, tv-display), or a skin (browser, macbook, ipad, iphone, android, kiosk, terminal, final-register, final-register-cfd, final-touch, final-touch-pro)."},{"type":"object","properties":{"device":{"type":"string"},"orientation":{"type":"string"},"responsivePreset":{"type":"string"},"customWidth":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"customHeight":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["device","orientation","responsivePreset"],"description":"A full DeviceConfig: device (browser|macbook|ipad|iphone|android|kiosk|terminal|final-register|final-register-cfd|final-touch|final-touch-pro|custom), orientation (portrait|landscape), responsivePreset (desktop|tablet|mobile|custom), optional customWidth/customHeight."}]},"theme":{"type":"string","enum":["light","dark"]},"palette":{"type":"string","enum":["final","mono","ocean","sunset","forest","grape","candy","custom"]},"customColors":{"type":"object","properties":{"primary":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accent":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"background":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}},"required":["primary","accent","background"]},"color":{"description":"A colour the user asked for, as they said it (\"pink\", \"dark green\", \"navy and gold\", or a hex). Resolved to a full custom palette for the flow's appearance — prefer this over guessing customColors hexes. Ignored when customColors is also given.","type":"string","minLength":1,"maxLength":60},"shape":{"type":"string","enum":["sharp","rounded","round"]},"fonts":{"type":"object","properties":{"heading":{"type":"string","minLength":1,"maxLength":80},"body":{"type":"string","minLength":1,"maxLength":80}}}},"required":["title"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Create a new flow","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"definitionHash":"a7baf43a60d378f6feaa2e82cf85271661ec4032da33b8b95f8d3c3315fc4c0e","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_create_flow_from_blueprint","title":"Start a new build by copying an FBB","description":"Create a NEW flow that starts as a complete, vetted application rather than an empty file tree — the fastest path to a working build when an FBB (a Final Business Blueprint: a whole app) matches what the user wants. For an app the user merely DESCRIBED, use start_build (the website's own start picks the FBB); this verb is for when the user asked YOU to copy one. Find one with search_blueprints({ kind: \"fbb\" }). The app's screens, navigation and command-frame wiring are copied byte-exact from the build the FBB points at, its custom tables are re-created under THIS organization's names (the copied code already uses those names — keep them), and a fill-in request is raised for each secret it reads. This ALWAYS creates a new flow: an FBB cannot be merged into an existing build (there are no screen-graph merge semantics). To add parts to a build you already have, use apply_blueprint_widgets instead. THE COPY ENDS YOUR TURN. It is the finished deliverable, not step one — the app is vetted and already runs. When it returns, say its `report` line and stop: do NOT preview, validate, edit or extend it, and do not start on anything else the user described. The result names the tools not to call.","inputSchema":{"type":"object","properties":{"blueprintId":{"type":"string","description":"The exact FBB id, e.g. 'flow.coffee-quick-service'. An id without a version suffix resolves to the newest published version."},"title":{"description":"Name for the new flow. Defaults to the blueprint's title.","type":"string","minLength":1,"maxLength":120},"flowId":{"description":"NOT SUPPORTED — passing this returns an error. An FBB replaces an app's entire screen graph, so it can only start a NEW build. It is declared here purely so a caller that assumes otherwise fails loudly instead of having the field stripped and getting a second flow it never asked for. To add parts to an existing build, use apply_blueprint_widgets({ flowId, picks }).","type":"string"},"supersedesFlowId":{"description":"The EMPTY placeholder flow you were told to build into, when a starter prompt pinned you to one before you knew an FBB would be used. This does NOT write into that flow — nothing can — it marks it as abandoned in favour of the flow created here, so the human's already-open builder tab follows you instead of watching an empty workspace forever. Pass the flow id from your instructions. Ignored (reported back as superseded:false) if that flow has any files, so it can never redirect a real build.","type":"string"},"agent":{"type":"string"},"hubToken":{"type":"string"},"device":{"description":"Override the copy's default preview device (the frame the builder opens it in): a surface word (mobile, tablet, kiosk, …), a get_scaffold profile, a skin (iphone, ipad, …) or a full DeviceConfig. Omit to follow the blueprint's surface. Changeable later with set_flow_device.","anyOf":[{"type":"string","minLength":1,"maxLength":64,"description":"A device word: a surface (desktop, tablet, mobile, kiosk, kitchen-display, menu-board, drive-thru), a get_scaffold profile (portrait-handheld, counter-tablet, wall-kiosk, tv-display), or a skin (browser, macbook, ipad, iphone, android, kiosk, terminal, final-register, final-register-cfd, final-touch, final-touch-pro)."},{"type":"object","properties":{"device":{"type":"string"},"orientation":{"type":"string"},"responsivePreset":{"type":"string"},"customWidth":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"customHeight":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["device","orientation","responsivePreset"],"description":"A full DeviceConfig: device (browser|macbook|ipad|iphone|android|kiosk|terminal|final-register|final-register-cfd|final-touch|final-touch-pro|custom), orientation (portrait|landscape), responsivePreset (desktop|tablet|mobile|custom), optional customWidth/customHeight."}]},"theme":{"type":"string","enum":["light","dark"]},"palette":{"type":"string","enum":["final","mono","ocean","sunset","forest","grape","candy","custom"]},"customColors":{"type":"object","properties":{"primary":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accent":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"background":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}},"required":["primary","accent","background"]},"color":{"description":"A colour the user asked for, as they said it (\"pink\", \"dark green\", \"navy and gold\", or a hex). Resolved to a full custom palette for the flow's appearance — prefer this over guessing customColors hexes. Ignored when customColors is also given.","type":"string","minLength":1,"maxLength":60},"shape":{"type":"string","enum":["sharp","rounded","round"]},"fonts":{"type":"object","properties":{"heading":{"type":"string","minLength":1,"maxLength":80},"body":{"type":"string","minLength":1,"maxLength":80}}}},"required":["blueprintId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Start a new build by copying an FBB","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"definitionHash":"ecd694eb2924e703ad65489d033b2c5017dcc2bad500897822e040fec7a3a99f","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_delete_flow_files","title":"Delete files from a flow","description":"Remove files from a flow's tree by path. Engine-owned paths are rejected. Recorded as a checkpoint + chat note like writes.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"paths":{"minItems":1,"type":"array","items":{"type":"string"}},"agent":{"type":"string"}},"required":["flowId","paths"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Delete files from a flow","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"definitionHash":"dcb380f5ef0d0a48ef6316cfba16dea070586e4d81b5f8f30777f10f6e756f9f","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_deploy_flow","title":"Build and deploy a flow","description":"Direct deploy for CI/agent workflows: builds the app in a server sandbox (npm install + vite build) and publishes the dist to Final web-hosting as a new live version. Two things stop a deploy: a failing build, and a hardcoded credential (a build is distributable to other companies, so a baked-in secret would ship to all of them — use request_secret). Guardrail and type findings do NOT block; run validate_flow first if you want them. Omit `changelog` and the release notes are drafted for you from what changed since your last deploy — call log_message (or pass `note` on write_flow_files) as you work so those notes describe intent rather than just file names. Uses your organization's provisioned hub credential automatically (the same long-term org JWT the extension tools use) — no token argument needed once you've connected. Pass `hostingToken` only as an escape hatch to override it; if no credential is available, reconnect via the Connect dialog or use open_in_builder and deploy from the Launch tool instead.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+$"},"changelog":{"type":"string"},"hostingToken":{"description":"Organization JWT accepted by hosting.finalpos.com. Optional escape hatch — omit to use your organization's stored hub credential (the same long-term org JWT the extension tools use).","type":"string"}},"required":["flowId","version"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Build and deploy a flow","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"definitionHash":"1aec006d0ac3bde6674eff26bad8462928f577ab714ca0fae37418be3cff4c19","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_get_blueprint","title":"Inspect one blueprint's code","description":"INSPECTION ONLY — read a blueprint's overlay code by id (from list_blueprints) to understand how it works. To USE a blueprint, apply it: apply_blueprint_widgets for a widget-set (materializes its widgets byte-exact with the command-frame plumbing intact AND provisions the custom tables its code depends on), create_flow_from_blueprint for an FBB. Do NOT re-type code from this tool into write_flow_files — that silently drops the vetted plumbing and leaves its tables unprovisioned. `tables` (when present) lists the custom tables the code binds to by exact name. For a WHOLE-FLOW blueprint this returns the screen manifest WITHOUT file bytes by default — an entire app is far too large to read this way, and you never need to: instantiation copies it server-side. Pass includeFiles: true only to audit the source.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"includeFiles":{"type":"boolean"}},"required":["id"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Inspect one blueprint's code","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"c97a096900f8a5506345aec20639cd135d60494a051b6b0bbeea09e6ebcfee04","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_get_preview_status","title":"Check preview health + logs","description":"Authoritative server-side health probe of the flow's preview sandbox, plus a short snapshot of recent dev-server logs (useful to diagnose a red screen or crash).","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"},"logSeconds":{"type":"integer","minimum":1,"maximum":20}},"required":["flowId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Check preview health + logs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"ab5599c647a6c88cf8dedbe7524cb670e466263c75684569fd2718191263f9b1","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_get_scaffold","title":"Get the app scaffold contract","description":"The contract every Final flow app is built against: which files the ENGINE owns (never write them — they are re-asserted verbatim), the baseline package.json (Vite + React 19 + TS + Tailwind + command-frame), the rules your files must follow, and the runtime contracts that compile and preview fine but fail on a real device (money in minor units, the first-load handshake, getX response unwrapping, tender success semantics). Call this once before writing any files; pass `device` for layout guidance.","inputSchema":{"type":"object","properties":{"device":{"description":"Target surface — \"portrait-handheld\", \"counter-tablet\", \"wall-kiosk\" or \"tv-display\". Approximate words work (\"kiosk\", \"phone\", \"menu board\"); an unrecognized value just returns the device-agnostic contract.","type":"string"}},"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Get the app scaffold contract","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"af09dfc04b43d5f4980f526f01692fe1d76a914480ddd64c4a1d88d41880d325","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_get_upstream_status","title":"Check a clone for upstream updates","description":"Has the build this flow was copied from released a newer version? Covers both a \"Make it yours\" clone of a listing and a build started from an FBB. Returns update.status: \"available\" (a newer deployed release exists — review it with get_upstream_update), \"current\" (up to date), \"unknown\" (the original has no comparable release), or \"gone\" (the original was DELETED — for a share clone, also if it was un-shared; an FBB's parent stays reachable while it exists, because the catalog vouches for it rather than the owner's share toggle), with the release notes published since the copy. Flows that are not snapshot-sourced copies return update: null. Cheap — safe to call whenever the user asks about updates.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"}},"required":["flowId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Check a clone for upstream updates","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"df89dd9049a28d7abe100a96d44f1271c9b2901ea0de257a00ff709cd0c7e251","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_get_upstream_update","title":"Review a pending upstream update","description":"Review what an update from the original build would change — the same review the builder shows its maker, shaped for an agent. Returns the releases since the clone, the clean changes (added/changed/removed paths, with full incoming contents for added+changed), and CONFLICTS: files where this flow's own edits and the update collide, each with complete base/ours/theirs contents. RESOLUTION CONTRACT (match the builder's behavior): when both sides' changes serve different purposes, merge them yourself — one file keeping BOTH sides' improvements; never wholesale-pick a side out of convenience. ONLY when the two sides genuinely contradict on the same visible thing (a color, a layout, a label, a behavior) ask YOUR user which they want, in plain product language — describe the visible difference, never file names or code. Then call apply_upstream_update with exactly one resolution per conflict. The trees you see are already in THIS organization's table namespace — never rename tableName literals yourself. adoptMode: true means the merge base is unrecoverable, so no merge is possible: offer the user adopting the latest release wholesale (apply_upstream_update with adopt: true) or staying put. upToDate: true means there is nothing to do.","inputSchema":{"type":"object","properties":{"flowId":{"type":"string"}},"required":["flowId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Review a pending upstream update","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"55cac950336a296227f72c8fb1cd980541d5d02a054ab080444d4c506e05bbf3","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_install_extension","title":"Install an extension org-wide","description":"Install an extension ORG-WIDE: creates the install link on EVERY company in your Final organization (demo companies included), skipping companies that already have it, so it is safe to retry. Installing is deliberate and org-visible — confirm with your user and call this ONLY when they explicitly asked for the extension. Find the id with list_extensions (organization and public extensions both install); after a successful install the extension's surfaces become embeddable — inspect them with list_extension_surfaces and build the ones carrying requirementsMd natively instead of embedding. Per-company failures are collected in the result rather than thrown, and `installState` reports the org-wide outcome (installed / partial / none).","inputSchema":{"type":"object","properties":{"extensionId":{"type":"string","minLength":1,"description":"The extension's id (the `id` from a list_extensions result — org or public source)."},"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"required":["extensionId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Install an extension org-wide","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"definitionHash":"196596c51379ecd4e8f6c7d62452aadd8741f4eb5b04b84894a0289d64273576","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_list_blueprints","title":"List the blueprint catalog","description":"List EVERY vetted, type-checked blueprint available to reuse — working functionality (gift cards, loyalty, payment surfaces, product grids, carts, customer views, order tickets, receipts), not just screen layouts. Check the catalog BEFORE creating custom tables or hand-rolling a capability. Returns id, kind, slot, title, summary, surfaces, tags, and selfPersisting per blueprint — selfPersisting: true means it reads/writes its OWN custom tables by exact name inside its code, which applying then provisions in your organization automatically (some are extension-owned and come from installing that extension); never create a table for a feature it covers. TWO KINDS, used differently: kind \"widget-set\" (the default this returns) is a set of parts you copy into an existing build with apply_blueprint_widgets; kind \"fbb\" is a Final Business Blueprint — a COMPLETE APP. It has no widgets to copy and is used with create_flow_from_blueprint to start a NEW flow. Pass kind: \"fbb\" to browse complete apps, or kind: \"any\" for both. To find the best match for a specific capability instead of scanning the whole catalog, use search_blueprints. get_blueprint is read-only inspection.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["widget-set","fbb","whole-flow","any"]}},"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List the blueprint catalog","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"e4843563b4e6b0f4b0df8e2573685540733a686ecf74a700e6d0ebf4dcaaa6ba","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_list_custom_tables","title":"List the org's custom data tables","description":"List your organization's custom data tables with their column schemas. Custom tables are Final's built-in, station-syncing database — data written on one station is automatically synced to every other station running the flow, and keeps working OFFLINE at the point of sale. They are the ONLY sanctioned persistence for generated apps (browser storage is per-device, never syncs, and is wiped on real Render terminals — validate_flow rejects it). Call this before create_custom_table to reuse an existing table instead of duplicating one. For NEW functionality, check search_blueprints before designing tables — a vetted blueprint may already provide the feature, and a selfPersisting blueprint's tables may NOT appear in this list (often extension-owned, resolved by name at runtime): their absence is never a reason to create lookalikes. Generated code reads/writes rows at runtime via renderClient.getCustomTableData / upsertCustomTableData (ground with lookup_command_frame).","inputSchema":{"type":"object","properties":{"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List the org's custom data tables","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"b6bb152d31c958688189ea42aed1ba26f1dca1d7e06ed52a079e6d65850b5dfc","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_list_extension_custom_tables","title":"List an extension's custom tables","description":"List the CUSTOM TABLES an extension registers (table name + typed columns), so generated code can read/write its data at runtime via renderClient.getCustomTableData / upsertCustomTableData by table name (ground the calls with lookup_command_frame). Only the org's OWN extensions expose their tables — a public / other-org extension returns an empty list with a note. Pass the extension's id from list_extensions; the org's non-extension tables come from list_custom_tables. Read-only. Does not write files.","inputSchema":{"type":"object","properties":{"extensionId":{"type":"string","minLength":1,"description":"The extension's id (the `id` from a list_extensions result)."},"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"required":["extensionId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List an extension's custom tables","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"470c1174e9c6b75807663bf4bc01b2c7c0355075b080ce70982eff69de3cdc39","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_list_extension_surfaces","title":"List an extension's surfaces","description":"List the SURFACES an extension exposes — embeddable iframe injection points, each with a surfaceId, a platform (builder/hub/render), a type, and a url. Render an installed surface inside a generated screen with the engine component `<ExtensionSurface surfaceId=\"<surfaceId>\" />` (ground it with lookup_engine_component). A surface may carry `requirementsMd` — full markdown build instructions for re-implementing it NATIVELY in the app: when present, prefer building that surface as first-class native screens in the app's own styling with real command-frame wiring, and embed `<ExtensionSurface>` only for surfaces without it. Works for the org's own extensions (hub credential) and public ones (resolved via the public marketplace, no credential needed). Pass the extension's id from list_extensions. Read-only. Does not write files.","inputSchema":{"type":"object","properties":{"extensionId":{"type":"string","minLength":1,"description":"The extension's id (the `id` from a list_extensions result)."},"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"required":["extensionId"],"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List an extension's surfaces","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"321bf8690a9da00a424041abfee62d4a57d56f98c829830429ce5a55d9be6477","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"},{"serverName":"com.finalpos/final","endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","name":"flow_list_extensions","title":"List available extensions","description":"List the platform EXTENSIONS available to your organization — the org's own plus the public marketplace — so you can suggest, inspect, or install one. Each entry carries an id, label, category, short description, and its source (organization or public); public results need no hub credential, and a note tells you when the org-owned side was unavailable. Pass query with the capability the user asked for — results are relevance-ranked against it (label, category, and the vocabulary of the blueprints each extension enables) and capped to the genuine matches, so an empty list means NO extension provides that capability. Omit query to browse the whole catalog with skip/limit paging — publicTotal reports how many marketplace rows exist. Inspect a result with list_extension_surfaces / list_extension_custom_tables; install it org-wide with install_extension ONLY when your user explicitly asked for it. Read-only. Does not write files.","inputSchema":{"type":"object","properties":{"query":{"description":"The capability the user asked for, in their own words (e.g. 'loyalty points', 'age gate', 'gift card') — results are relevance-ranked and capped to genuine matches. Omit to browse the org's own plus the first public page.","type":"string"},"skip":{"description":"Public-marketplace page offset (default 0).","type":"integer","minimum":0,"maximum":5000},"limit":{"description":"Public-marketplace page size (default 24, max 50).","type":"integer","minimum":1,"maximum":50},"hubToken":{"description":"Organization JWT fallback, only if the hub rejects your API key for this route.","type":"string"}},"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List available extensions","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"definitionHash":"ea5fd5ef078e364bc32bb79244cf01ec4c6ed464faf509003927c06c1cc411cc","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-03T17:46:07.241Z","metadataTrust":"untrusted"}],"endpoints":[{"endpointFingerprint":"fc5ec82927279d4070472ab0b1972b095f34d0fa16bac33efcb2678918ba6121","protocol":"streamable-http","status":"indexed","toolCount":50,"observedAt":"2026-11-03T17:46:07.241Z"}],"authentication":"unknown"},"connectionConfigurations":{"status":"ready","authentication":"not embedded","clients":{"Claude Desktop":{"mcpServers":{"com.finalpos/final":{"url":"https://ai.finalpos.com/mcp"}}},"Cursor":{"mcpServers":{"com.finalpos/final":{"url":"https://ai.finalpos.com/mcp"}}},"VS Code":{"servers":{"com.finalpos/final":{"type":"http","url":"https://ai.finalpos.com/mcp"}}}}},"resourceType":"mcp-server","callable":true,"runtime":{"callable":true,"protocols":["mcp"]},"interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://ai.finalpos.com/mcp"}],"profile":{"apiVersion":"1","schemaVersion":"1","id":"mcp-server:com.finalpos%2Ffinal","resourceType":"mcp-server","canonicalUrl":"https://www.agentsjunction.com/api/v1/servers/com.finalpos%2Ffinal","name":"com.finalpos/final","description":"Build custom POS apps with any AI agent: checkout flows, kiosks, payment terminals. Plus store ops.","interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://ai.finalpos.com/mcp"}],"capabilities":[],"identity":{"source":"official-registry","websiteUrl":"https://finalpos.com/mcp","repositoryUrl":"https://github.com/Final-Commerce/final-pos-mcp","version":"2.0.1"},"verification":{"state":"official","confidence":100},"operations":{"resourceType":"mcp-server","name":"com.finalpos/final","status":"online","lastCheckedAt":"2026-11-03T20:17:49.450Z","lastSuccessfulCheck":"2026-11-03T20:17:49.450Z","latencyMs":801,"consecutiveFailures":0,"isStale":false,"checks":{"endpointReachable":true,"protocolValid":true,"agentCardValid":null,"mcpHandshakeValid":true},"lastSeen":null,"lastSuccessfulInteraction":null,"lastHealthCheck":"2026-11-03T20:17:49.450Z","source":{"type":"health-check","url":null},"observedAt":"2026-11-03T20:17:49.450Z"},"security":null,"timestamps":{"createdAt":"2026-10-18T15:49:47.968Z","updatedAt":"2026-10-18T15:49:47.968Z","observedAt":"2026-11-03T20:17:49.450Z"},"compatibility":{"serverVersion":"2.0.1","protocolVersions":[{"protocol":"mcp","version":null}]}}}}