Counterpart
Allows Amazon's Alexa+ voice assistant to run a small business by voice, including opening and moving orders, adding parts or labor, checking and reordering stock, taking payment, and getting day summaries and sales reports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Counterpartwhat's my shop's daily summary?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Counterpart
One voice assistant for any small business that runs on orders.
Counterpart is a self-hosted MCP server that lets Alexa+ run a small business's day by voice: open a job, move it along, add parts or labor, check and reorder stock, take payment, and hear how the day is going. Built for the Alexa+ track of Build, Ship, Shape: Amazon Developer Hackathon (2026).
The idea
A mechanic under a car and a baker with frosting on their hands have the same problem: the system that runs their shop is on a computer across the room. Their businesses look nothing alike, but they share a shape — orders that move through stages, items that get used up, payments at the end.
Counterpart has one engine for that shape and a business profile for each kind of business. A profile is a YAML file with the business's vocabulary, stages, and tool names. The server generates each tool's name, description, and input schema from it, so Alexa+ reads a repair shop's open_work_order ("Open a new work order, also called a repair order, RO, ticket or job…") and a bakery's take_cake_order from the same code.
Related MCP server: @agentpos-alexa/bridge
Tools
Intent | Auto repair | Bakery |
Day summary (with UI) |
|
|
Find orders |
|
|
Open an order |
|
|
Change stage |
|
|
Add to an order |
|
|
Check stock |
|
|
Reorder |
|
|
Close out and charge |
|
|
Sales report (with UI) |
|
|
Every reply is one or two plain English sentences meant to be spoken. People say "the Civic" or "Dana's", not "order 4821", so every tool accepts spoken references and asks "which one?" when two orders match. Voice assistants retry, so the writes that can safely repeat are idempotent: opening the same order again within two minutes returns the one already open, moving an order to the stage it is already in changes nothing, reordering skips items already on order, and closing out an order that was already closed today reports it without charging again. Adding parts or labor is deliberately not deduplicated, because adding the same item twice can be intended. The two reporting tools also return an MCP Apps UI for screen devices.
Architecture
MCP client (Alexa+ or any MCP host)
│ Streamable HTTP · MCP 2025-11-25 · Authorization: Bearer <token>
▼
Counterpart
http/ /ping · /mcp · token → business · per-client sessions bound to a business · JSON logs
tools/ nine tools generated from the business profile · MCP Apps UIs
domain/ pure rules: orders · inventory · spoken references · reports
store/ MemoryStore (dev) · DynamoStore (single-table DynamoDB)The bearer token decides which business is calling. Each client connection gets its own MCP session, built from that business's profile and bound to the business whose token opened it. A session only accepts requests that carry a token for that same business. An unknown session id, or one that belongs to another business, gets a 404 so the client starts a new session.
Quick start
Requirements: Node.js 24 and npm. Docker if you want DynamoDB.
npm ci
npm run devThe in-memory store seeds two demo businesses at startup, with the development-only tokens demo-shop-token and demo-bakery-token. Check the server end to end:
npm run smoke -- http://127.0.0.1:3000/mcp demo-shop-tokenTo use a graphical MCP client such as the MCP Inspector, point it at http://127.0.0.1:3000/mcp with the header Authorization: Bearer demo-shop-token. For hosts that cannot send headers, run locally without a token instead:
npx cross-env COUNTERPART_DEV_BUSINESS=shop HOST=127.0.0.1 npm run devThat mode is refused on any address other than 127.0.0.1.
Run with DynamoDB Local
docker compose up -d --build
npx cross-env COUNTERPART_STORE=dynamo DYNAMODB_ENDPOINT=http://localhost:8000 npm run seed -- --reset
npm run smoke -- http://localhost:3000/mcp demo-shop-tokenDynamoDB Local runs in memory, so reseed whenever its container restarts.
To issue a real token for a business, stored only as a SHA-256 hash:
npx cross-env COUNTERPART_STORE=dynamo DYNAMODB_ENDPOINT=http://localhost:8000 npm run token -- shopConfiguration
Variable | Default | Meaning |
|
| HTTP port |
|
| Bind address |
|
|
|
|
| Table name |
|
| AWS region |
| — | DynamoDB Local URL; unset for AWS |
| — | Local no-token mode, only on |
| — |
|
Tests
npm test # unit and integration
npm run typecheck
npm run dynamo:up # start DynamoDB Local
npm run test:dynamo # store contract against DynamoDB LocalDynamoDB Local takes a few seconds to start; wait for it before running npm run test:dynamo.
MemoryStore and DynamoStore run the same contract suite, including atomic writes and inclusive civil-date ranges. test/golden/ holds spoken phrases paired with the tool each should trigger, for evaluating tool selection against a real model.
Adding a business
Add a YAML file to src/profiles/ with the business's nouns and synonyms, its stages and which one closes an order, its nine tool names, an optional asset (for example a vehicle) and any order fields (for example a cake's flavor). Profiles are validated at startup: tool names must be unique and well formed, the closing stage must exist, and order fields cannot reuse the ids the tools already use. Seed data lives in seed/.
Project layout
src/profiles/ business profiles and their validation
src/domain/ pure business rules
src/store/ store interface, in-memory and DynamoDB implementations
src/speech/ spoken English phrasing
src/tools/ the nine MCP tools and the MCP Apps resources
src/http/ Express app, auth, sessions, request context
ui/ the two MCP Apps UIs (built with Vite into single HTML files)
seed/ deterministic demo data and the seeding CLI
infra/ token CLI, smoke check, build helpers
test/ unit, integration, contract and golden-phrase testsStatus
Done: the server, both profiles, the nine tools, token auth with per-business sessions, DynamoDB persistence, structured logs, the two MCP Apps UIs, the container image, and the tests.
In progress: deployment to AWS (ECS Express Mode with DynamoDB) and a live voice demo on Alexa. The Alexa+ MCP Toolkit is not publicly available (@alexa-ai/cli is served from a private registry), so the voice demo uses an Alexa Skill bridge that emulates the Alexa+ orchestrator. See docs/friction-log.md.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Look up shop customers, vehicles, work orders and parts, and create orders or book appointments.
Search customers, manage quotes, work orders, action items, and calendar events for your business
- ObraOAuthcom.tryobra
Construction job costing: ask how a project is doing, capture receipts, record transactions.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables store operations including inventory and sales queries and automated replenishment ordering through natural language.3-
- AlicenseNot gradedqualityBmaintenanceEnables Alexa+ add-on functionality for AgentPOS stores, providing in-conversation checkout via UCP, payment rails (Stellar and Amazon Wallet), and merchant agent integration on Bedrock AgentCore.Apache 2.0
- AlicenseAqualityAmaintenanceEnables small-business AI assistants to answer customer questions about hours, offerings, FAQs, staff, and booking from a single business.yaml config, with industry-specific tools and guardrails.2321 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables Alexa+ assistants to run multi-step personal-ops tasks and produce machine-checkable receipts with per-step evidence, so actions are only claimed done when actually verified.MIT