AppLink AI Skill

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
~/my-app · agent + applink
›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
Illustrative session
Endpoints, fully specified
11
Callback contracts
5
Status codes explained
30
AI agents supported
20+
Language templates
6
Dependencies
0
Why it exists

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.

Without the skill
JavaScript
// 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
With the skill
JavaScript
// 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.
Install

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
Inside the skill

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.

  1. Your prompt
    plain words
  2. Agent + AppLink Skill
    rules · catalog · CLI
  3. Your backend
    holds the credentials
  4. api.applink.com.bd
    HTTPS · allow-listed IP
  5. Banglalink subscribers
    + 5 callbacks back
SKILL.md · AGENTS.md

The 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.json

The 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.mjs

An 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.

Offline CLI

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.

CLI commands
CommandAnswers
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?
checklistAm 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.
What it prevents

The mistakes that cost money, credentials or approval

Mistakes the skill prevents
MistakeConsequence
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 chargeThe debit call only sends an OTP. Orders fulfilled that nobody paid for.
Re-running OTP generation to retry a verificationA second charge against a real person.
destinationAddresses as a stringIt is always an array. Sends fail.
Using OTP or subscription calls as a login checkThey are paid transactions. Every sign-in costs an SMS.
Hardcoded applicationId / passwordA credential that can charge your subscribers, committed to git.
Logging the subscription notification bodyIt contains your password, now in your log aggregator.
USSD sessions in an in-process mapWorks in development, breaks the moment you scale.
TLS verification switched offYour credentials become interceptable.
Task skills

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
Coverage

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
Quick start

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.”
Quick start
# 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:3000

Let 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.