Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
"name": "Terminal49"
},
"metadata": {
"description": "Terminal49 container-tracking and trade-intelligence tools and agent skills",
"version": "0.2.0"
"description": "Terminal49 MCP server and agent skills for container tracking and trade intelligence",
"version": "0.3.0"
},
"plugins": [
{
"name": "terminal49",
"source": "./plugins/terminal49",
"description": "Use Terminal49 MCP tools to track and investigate container shipments, and Terminal49 trade intelligence to research US ocean imports",
"version": "0.2.0"
"description": "Container tracking, shipment record updates, and US import trade intelligence from the Terminal49 MCP server, with agent skills",
"version": "0.3.0"
}
]
}
8 changes: 4 additions & 4 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
"name": "Terminal49"
},
"metadata": {
"description": "Terminal49 container-tracking and trade-intelligence tools and agent skills",
"version": "0.2.0"
"description": "Terminal49 MCP server and agent skills for container tracking and trade intelligence",
"version": "0.3.0"
},
"plugins": [
{
"name": "terminal49",
"source": "./plugins/terminal49",
"description": "Use Terminal49 MCP tools to track and investigate container shipments, and Terminal49 trade intelligence to research US ocean imports",
"version": "0.2.0"
"description": "Container tracking, shipment record updates, and US import trade intelligence from the Terminal49 MCP server, with agent skills",
"version": "0.3.0"
}
]
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
node_modules/
npm-debug.log*
plugins/terminal49/evals/results/
dist/
29 changes: 23 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,25 @@ This is a public, cross-platform plugin marketplace for Terminal49.
resource identifier.
- Do not ask users to paste credentials into chat. Let the client initiate its
OAuth connection flow.
- The `trade-intelligence` skill reads a Terminal49 API key that the user saves
in their own terminal (`T49_API_KEY` or `~/.t49_api_key`). Never put a real
key in examples, logs, or chat.
- Nothing in `plugins/terminal49` may read a credential from the user's
machine (environment variables or home-directory files). Every Terminal49
call goes through the MCP server's OAuth connection. The Anthropic directory
holds plugins that read local credentials for review, and `npm run validate`
rejects them.

## Shared source of truth

- The skills under `plugins/terminal49/skills/` are the shared behavioral
guidance for all clients:
- `container-tracking/SKILL.md` covers container and shipment questions with
the Terminal49 MCP tools.
- `trade-intelligence/SKILL.md` covers US import market research through the
Terminal49 REST API, using its bundled `scripts/ti.py` client and
`references/api.md`.
- `record-updates/SKILL.md` covers the `set_party_role` and
`set_custom_field` write tools.
- `trade-intelligence/SKILL.md` covers US import market research with the
Terminal49 MCP trade intelligence tools.
- Base skill guidance on the production MCP server's tool descriptions and
server instructions in
[Terminal49/API](https://github.com/Terminal49/API) (`packages/mcp/src`).
- `plugins/terminal49/.mcp.json` and `plugins/terminal49/mcp.json` are the MCP
adapters for Claude/Codex and Cursor respectively. Keep their server entries
identical.
Expand All @@ -47,3 +53,14 @@ client is installed, also use its native validator before publishing.

Bump the version in all three plugin manifests and both versioned marketplace
files for every release. Keep releases small and document user-visible changes.

## Directory submissions

- Anthropic's directory reads `plugins/terminal49` from this repository and
publishes each new commit on the tracked branch after its checks. Keep
`plugins/terminal49` free of symbolic links, binary files other than images,
and files over 256 KiB.
- The OpenAI plugin directory takes a ZIP. Build it with
`npm run build:openai-zip`, which writes `dist/terminal49-openai-<version>.zip`
from the Codex manifest, the skills, and the icon. Upload a new ZIP whenever
the skills or listing metadata change.
39 changes: 25 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,19 @@ This marketplace currently publishes one plugin:
## What the plugin provides

- OAuth connection to `https://mcp.terminal49.com`
- A shared `container-tracking` skill for choosing and sequencing MCP tools
- Guidance for status, pickup readiness, holds, ETAs, routes, delays, and
demurrage-risk questions
- Guardrails around tracking-request creation, credentials, dates, and missing
data
- A `container-tracking` skill for choosing and sequencing MCP tools: status,
pickup readiness, holds, ETAs, routes, delays, demurrage risk, fleet counts
that match the Terminal49 dashboard, customer filters, and documents
- A `record-updates` skill for changing the drayage carrier, other parties, and
custom fields, only when you ask
- A `trade-intelligence` skill for competitor research, sourcing, and market
trends from US ocean import bill-of-lading records since 2022 (for accounts
with trade intelligence enabled)
- Guardrails around tracking requests and other writes, credentials, untrusted
document text, dates, and missing data

The plugin does not contain API keys or customer data. Container tracking
authenticates through the MCP client's OAuth flow. Trade intelligence currently
uses a Terminal49 API key that you save in your own terminal; see the
[plugin README](plugins/terminal49/README.md#trade-intelligence-api-key).
The plugin contains no API keys, scripts, or customer data. Every Terminal49
call goes through the MCP client's OAuth flow.

## Install

Expand Down Expand Up @@ -83,7 +83,8 @@ After connecting your Terminal49 account, ask your agent:
- “Where is container ABCU1234567?”
- “Is this container ready for pickup, and are there any holds?”
- “Explain what changed in this container's journey.”
- “Show containers updated since yesterday and group them by status.”
- “How many of my containers are ready for pickup?”
- “Set the drayage carrier on ABCU1234567 to Example Trucking.”
- “Who are the largest US importers of office chairs, and where do they source
them?”

Expand All @@ -98,20 +99,29 @@ account with trade intelligence enabled.
├── .agents/plugins/marketplace.json # Codex marketplace
├── .claude-plugin/marketplace.json # Claude Code and Copilot marketplace
├── .cursor-plugin/marketplace.json # Cursor marketplace
├── openai/review.json # OpenAI directory review cases, merged into the ZIP
├── scripts/
│ ├── build-openai-zip.mjs # Builds the OpenAI directory ZIP
│ └── validate.mjs
└── plugins/terminal49/
├── .claude-plugin/plugin.json
├── .codex-plugin/plugin.json
├── .cursor-plugin/plugin.json
├── .mcp.json # Claude and Codex MCP adapter
├── mcp.json # Cursor MCP adapter
├── README.md
├── assets/logo.svg # Referenced by the Cursor manifest
├── assets/
│ ├── icon.svg # Square icon for the directories
│ └── logo.svg # Referenced by the Cursor manifest
├── evals/ # Mocked behavioral evals
└── skills/
├── container-tracking/SKILL.md
├── container-tracking/
│ ├── SKILL.md
│ └── references/ # Fleet queries and documents
├── record-updates/SKILL.md
└── trade-intelligence/
├── SKILL.md
├── references/api.md # Endpoint parameters and fields
└── scripts/ti.py # Python 3 API client, no dependencies
└── references/data-guide.md
```

The skills are shared. Each platform-specific manifest and MCP file is a thin
Expand All @@ -124,6 +134,7 @@ Requires Node.js 22 or newer.

```sh
npm run validate
npm run build:openai-zip # writes dist/terminal49-openai-<version>.zip
```

CI runs the same validation on every push and pull request via
Expand Down
52 changes: 52 additions & 0 deletions openai/review.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"review": {
"test_cases": {
"positive": [
{
"description": "List the containers that are ready for pickup with the dashboard definition",
"prompt": "Which of my containers are ready for pickup?",
"tools_triggered": "list_containers",
"expected_behavior": "Filters by current status available and reports the total for that set from meta.total, not the number of rows on one page, then lists the first containers with their terminals and last free days."
Comment on lines +8 to +9

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Align the review case with the prescribed count tool

For this exact “How many…” prompt, the new shared guidance in references/fleet-queries.md directs the agent to summarize_containers, whose response exposes total, while this submission declares list_containers, meta.total, and listing rows as required behavior. An agent following the bundled skill can therefore return the correct count but fail the initial directory review case; either change this case to expect summarize_containers or change the skill's count workflow.

AGENTS.md reference: AGENTS.md:L23-L33

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 371d314. The case now asks "Which of my containers are ready for pickup?", which the skill answers with list_containers and meta.total. "How many" questions stay with summarize_containers, as fleet-queries.md says. The OpenAI ZIP is rebuilt with the new case.

},
{
"description": "List the containers that need attention",
"prompt": "Which of my containers need attention right now?",
"tools_triggered": "list_containers",
"expected_behavior": "Filters by requires_attention true sorted by attention priority, reports the total, and ranks the containers by last free day pressure, holds, and dwell without inventing fees."
},
{
"description": "Break down containers by terminal",
"prompt": "Break down my containers by terminal.",
"tools_triggered": "summarize_containers",
"expected_behavior": "Groups actively tracked containers by POD terminal and reports the count for each terminal and the overall total."
},
{
"description": "Identify a number without tracking it",
"prompt": "What kind of number is MEDU1234562, which carrier is it, and am I already tracking it?",
"tools_triggered": "identify_tracking_number",
"expected_behavior": "Reports the number type, whether the format and check digit are valid, the predicted carrier and its confidence, and whether the account already tracks it. It does not create a tracking request."
},
{
"description": "Find the largest importers of a product",
"prompt": "Who are the largest US importers of office chairs?",
"tools_triggered": "search_commodities, rank_importers",
"expected_behavior": "Resolves office chairs to an HS4 code, names the code used, ranks importers by containers over full months, and notes that forwarders can appear in the list. The test account needs trade intelligence enabled."
}
],
"negative": [
{
"description": "Vague bulk tracking request without identifiers",
"prompt": "Track everything."
},
{
"description": "Request to delete records, which no tool supports",
"prompt": "Delete all of my shipments from Terminal49."
},
{
"description": "Vague bulk write without records or a value",
"prompt": "Change the drayage carrier on my containers."
}
]
}
}
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"node": ">=22"
},
"scripts": {
"validate": "node scripts/validate.mjs"
"validate": "node scripts/validate.mjs",
"build:openai-zip": "node scripts/build-openai-zip.mjs"
}
}
13 changes: 10 additions & 3 deletions plugins/terminal49/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "terminal49",
"displayName": "Terminal49",
"version": "0.2.0",
"description": "Track and investigate container shipments with Terminal49 MCP tools, and research US ocean import markets with Terminal49 trade intelligence.",
"version": "0.3.0",
"description": "Track and investigate container shipments, update shipment records, and research US ocean import markets with the Terminal49 MCP server.",
"author": {
"name": "Terminal49"
"name": "Terminal49",
"email": "[email protected]",
"url": "https://www.terminal49.com"
},
"homepage": "https://terminal49.com",
"repository": "https://github.com/Terminal49/agent-plugins",
Expand All @@ -18,6 +20,11 @@
"supply-chain",
"trade-intelligence"
],
"icon": "./assets/icon.svg",
"documentationUrl": "https://terminal49.com/docs/mcp/home",
"supportUrl": "https://www.terminal49.com/contact",
"privacyPolicyUrl": "https://www.terminal49.com/privacy",
"termsOfServiceUrl": "https://www.terminal49.com/terms",
"skills": "./skills/",
"mcpServers": "./.mcp.json"
}
26 changes: 17 additions & 9 deletions plugins/terminal49/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"name": "terminal49",
"version": "0.2.0",
"description": "Track and investigate container shipments with Terminal49 MCP tools, and research US ocean import markets with Terminal49 trade intelligence.",
"version": "0.3.0",
"description": "Track and investigate container shipments, update shipment records, and research US ocean import markets with the Terminal49 MCP server.",
"author": {
"name": "Terminal49"
"name": "Terminal49",
"email": "[email protected]",
"url": "https://www.terminal49.com"
},
"homepage": "https://terminal49.com",
"repository": "https://github.com/Terminal49/agent-plugins",
Expand All @@ -20,18 +22,24 @@
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "Terminal49",
"shortDescription": "Track container shipments and research US imports",
"longDescription": "Connect to Terminal49 and use guided workflows for container status, pickup readiness, holds, ETAs, routes, delays, and demurrage risk, plus trade-intelligence research on US ocean imports: competitors, sourcing, and market trends.",
"shortDescription": "Track containers and shipments",
"longDescription": "Connect your Terminal49 account to answer container and shipment questions in plain language: status, pickup readiness, holds, last free day, ETAs, routes, rail moves, delays, and demurrage risk. Count and list containers with the same definitions as the Terminal49 dashboard, find shipping documents, and update the drayage carrier, other parties, or custom fields when you ask. Accounts with trade intelligence can also research US ocean imports: what a company imports, who imports a product, and how volumes by port, carrier, and origin are changing. The plugin reads only the shipments and documents your Terminal49 account can see. It changes records only when you ask for a specific change.",
"developerName": "Terminal49",
"category": "Productivity",
"capabilities": [
"Interactive",
"Write"
],
"websiteURL": "https://terminal49.com",
"websiteURL": "https://www.terminal49.com",
"supportURL": "https://www.terminal49.com/contact",
"privacyPolicyURL": "https://www.terminal49.com/privacy",
"termsOfServiceURL": "https://www.terminal49.com/terms",
"defaultPrompt": [
"Track a container or investigate the latest status of my shipments",
"Show what a competitor imports, from where, and how its volume is trending"
]
"Which of my containers are ready for pickup?",
"Which of my containers need attention today?",
"Who are the largest US importers of office chairs?"
],
"composerIcon": "./assets/icon.svg",
"logo": "./assets/icon.svg"
}
}
8 changes: 5 additions & 3 deletions plugins/terminal49/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
{
"name": "terminal49",
"displayName": "Terminal49",
"version": "0.2.0",
"description": "Track and investigate container shipments with Terminal49 MCP tools, and research US ocean import markets with Terminal49 trade intelligence.",
"version": "0.3.0",
"description": "Track and investigate container shipments, update shipment records, and research US ocean import markets with the Terminal49 MCP server.",
"author": {
"name": "Terminal49"
"name": "Terminal49",
"email": "[email protected]",
"url": "https://www.terminal49.com"
},
"homepage": "https://terminal49.com",
"repository": "https://github.com/Terminal49/agent-plugins",
Expand Down
Loading
Loading