Your AI agent, fluent in AppLink.
Give Claude Code, Codex, Cursor, Copilot and 20+ coding agents the complete AppLink contract. Every endpoint, callback and status code, plus the rules that keep an app approved, so the integration they write is right the first time.
- Any language
- No network calls
- Never sees a credential
›Add AppLink subscription and SMS to this app: users opt in by SMS keyword, get a welcome message, and can text STOP to unsubscribe.●applink skill loaded · 11 endpoints · 5 callbacks · 30 status codes✓configAPPLINK_APP_ID, APPLINK_PASSWORD read from env, validated at boot✓clientstatusCode checked on every reply (HTTP 200 carries failures too)✓callbacksPOST /sms/receive · POST /subscription/notify (body never logged)✓validatesms-send · destinationAddresses is an array ✓✓reviewno credentials in source, logs or client bundle→ready for applink-golive
- Endpoints, fully specified
- 11
- Callback contracts
- 5
- Status codes explained
- 30
- AI agents supported
- 20+
- Language templates
- 6
- Dependencies
- 0
Agents are confident. Telco contracts are unforgiving.
Without the contract, a capable model writes code that compiles, ships and quietly marks failures as successes. That is not carelessness; it is missing information. The skill supplies it.
// Sends an SMS. Looks fine, ships, and lies.
const res = await fetch(SMS_URL, { method: "POST", body });
if (res.ok) return "sent"; // AppLink returns HTTP 200 for errors
// Takes a payment.
const r = await debit(order);
if (r.statusCode === "P1003") {
markPaid(order); // nothing has been charged yet
}
// Verification failed? Try again...
await debit(order); // a second charge on a real person// Every reply is judged on statusCode, never on HTTP status.
const reply = await res.json();
if (reply.statusCode !== "S1000") {
throw new AppLinkError(reply.statusCode, reply.statusDetail);
}
// P1003 means the OTP was sent. The charge is two calls.
await ledger.save(order.externalTrxId, r.requestCorrelator, "PENDING_OTP");
// Money moves at /caas/otp/verify with the SAME requestCorrelator;
// the charging notification is the authoritative outcome.
// Retry = re-prompt for the OTP. Never re-run generation.One command in the agent you already use
Every agent gets the same content behind a different filename. Plugin hosts add slash commands; everything else still gets the full references, catalog and CLI.
- Plugin
- Skills, slash commands and always-on context
- Skills
- Skill files load on relevant tasks
- Rules
- Always-on instructions
- Context
- Reads AGENTS.md with zero setup
/plugin marketplace add hSenidMobileCPaaS/Applink-as-a-Skill
/plugin install applink@applink
# or clone it as a skill directly
git clone https://github.com/hSenidMobileCPaaS/Applink-as-a-Skill ~/.claude/skills/applink- Claude CodePlugin
- CodexPlugin
- GitHub Copilot CLIPlugin
- Gemini CLIPlugin
- AntigravityPlugin
- QoderPlugin
- Hermes AgentPlugin
- Claude Agent SDKSkills
- CursorRules
- WindsurfRules
- ClineRules
- KiroRules
- Copilot (editor)Rules
- OpenCodeContext
- AiderContext
- ZedContext
- AmpContext
- JulesContext
- JetBrains JunieContext
- VS Code + CodexContext
Six layers, one source of truth
Derived field by field from the official API reference, and checked in CI. No endpoint, parameter or status code in it was invented, and it records what AppLink does not offer so an agent cannot fill the gap with a guess.
- Your promptplain words
- Agent + AppLink Skillrules · catalog · CLI
- Your backendholds the credentials
- api.applink.com.bdHTTPS · allow-listed IP
- Banglalink subscribers+ 5 callbacks back
SKILL.md · AGENTS.mdThe rules
The six rules agents apply without being asked: credentials in env, never call AppLink from a client, consent before any charge, opaque subscriber IDs, two-step charging, idempotency.
catalog/applink-api.jsonThe contract, as data
Every endpoint, parameter, response field and status code as structured data, so the agent reads names instead of recalling them.
tools/applink.mjsAn offline CLI
What an MCP server would give you, without running one. No network calls, never sees a credential, works in any agent with a shell.
references/13 reference guides
Per-service guides, callbacks, status codes, security, go-live, what AppLink does not offer, and every endpoint written out as a runnable curl.
templates/Worked templates
Config, client and callback handlers in TypeScript/Node, Python, Java, Go, PHP and C#, read for shape, never pasted blind.
scripts/Mock, smoke tests, CI
A local stand-in for AppLink that validates every request body in any language, plus smoke and callback tests for bash and PowerShell.
A contract your agent can query
Zero dependencies, no server, no process to keep alive. Add --json to any command for machine-readable output; agents without a shell read the catalog directly.
| Command | Answers |
|---|---|
| list [category] | What services exist? |
| show <id> | What exactly does this call take and return? |
| search "<query>" | Which service does the thing I want? |
| curl <id> [k=v] | Give me the call, as a runnable request |
| validate <id> '<json>' | Is this payload correct, types and field names and all? |
| response <id> | What comes back, what do I persist, what happens next? |
| code <statusCode> | What does this error mean, and what do I do? |
| diagnose "<symptom>" | Why is this not working? |
| practices [severity] | What must I not get wrong? |
| checklist | Am I ready for production? |
$ node tools/applink.mjs validate sms-send '{"message":"hi","destinationAddresses":"tel:8801959979376"}'
✗ 4 error(s) against sms-send
✗ Missing required field "version"
✗ Missing required field "applicationId"
✗ Missing required field "password"
✗ "destinationAddresses" must be an ARRAY, got string. This is the most
common Applink integration bug.The mistakes that cost money, credentials or approval
| Mistake | Consequence |
|---|---|
| Deciding on the HTTP status (res.ok, raise_for_status()) | AppLink returns HTTP 200 for errors. Every failure reported as a success. |
| Treating P1003 as a completed charge | The debit call only sends an OTP. Orders fulfilled that nobody paid for. |
| Re-running OTP generation to retry a verification | A second charge against a real person. |
| destinationAddresses as a string | It is always an array. Sends fail. |
| Using OTP or subscription calls as a login check | They are paid transactions. Every sign-in costs an SMS. |
| Hardcoded applicationId / password | A credential that can charge your subscribers, committed to git. |
| Logging the subscription notification body | It contains your password, now in your log aggregator. |
| USSD sessions in an in-process map | Works in development, breaks the moment you scale. |
| TLS verification switched off | Your credentials become interceptable. |
A skill for every stage
On plugin hosts each one is also a slash command.
/applinkGeneral AppLink work: the rules and the service map/applink-scaffoldStart a new integration: config, client, typed models/applink-callbacksBuild the inbound webhooks/applink-reviewAudit existing code for costly mistakes/applink-debugTurn a status code or symptom into a fix/applink-goliveRun the pre-production checklist/applink-helpQuick reference
Every published API, in your language
JSON over HTTPS, so nothing is tied to one runtime. Every endpoint is also written out as curl for any stack.
- SMS
- Send (MT), broadcast to base, receive (MO), delivery reports
- USSD
- Screens, input, the mo-init → mt-fin session state machine
- Subscription
- Register, unregister, base size, charging info, notifications
- OTP
- Request and verify, five-minute validity
- CaaS
- Two-step OTP charge, charging notifications, reconciliation
- TypeScript / Node
- Python
- Java
- Go
- PHP
- C# / .NET
- Anything else, via curl
From a prompt to production
Configuration is two credentials and the endpoints your app is provisioned for. Point those at the bundled mock and every request body your code sends is checked, whatever language sent it. Then ask for the feature in plain words.
“Add AppLink subscription and SMS to this app: users opt in by SMS keyword, get a welcome message, and can text STOP to unsubscribe.”
# 1. Configure: credentials, then uncomment ONLY the endpoints
# enabled on your application
cp templates/.env.example .env
# 2. Confirm your egress IP is allow-listed (run this ON THE SERVER)
curl -4 https://api.ipify.org
# 3. Verify connectivity and credentials
./scripts/smoke-test.sh # Windows: .\scripts\smoke-test.ps1
# 4. Test your callback handlers, no AppLink account needed
./scripts/test-callbacks.sh http://localhost:3000Let your agent write the integration.
Free to install and use, unmodified, for your own AppLink integrations. The code your agent writes is yours. As with any billing code, verify charging against the API reference before going live.