Connect Claude, ChatGPT to Tino (MCP)
Tino Connector lets AI assistants (Claude, ChatGPT, other MCP apps) work with a Tino account: view and manage hosting services, VPS, domains, DNS records, invoices and tickets with plain-language requests, only within the scopes the customer approved. The connection uses the MCP (Model Context Protocol) standard and OAuth sign-in: the assistant never sees the customer's password or OTP code.
Updated: 2026-10-27. MCP server source code: the public repository tinovn/tino-connector-mcp.
Overview
| Item | Value |
|---|---|
| MCP server | https://api.tino.vn/mcp |
| Protocol | MCP Streamable HTTP: each POST is one JSON-RPC message and returns JSON (no SSE, no sessions); GET returns 405 |
| Protocol versions | 2025-06-18, 2025-03-26, 2024-11-05 |
| Authentication | Authorization: Bearer <token>: an OAuth token (Sign in with Tino) or a personal API token |
| Client metadata (RFC 9728) | https://api.tino.vn/.well-known/oauth-protected-resource |
| Client self-registration (RFC 7591) | POST https://api.tino.vn/oauth/register (registration_endpoint in https://api.tino.vn/.well-known/oauth-authorization-server) |
| Claude Code plugin | marketplace tinovn/tino-connector-mcp, plugin tino@tinovn |
Connecting
Claude (web, Desktop, mobile)
- Open Claude, go to Customize → Connectors, and click Add custom connector.
- Name:
Tino; URL:https://api.tino.vn/mcp. - Leave authentication at the default (OAuth sign-in); no client ID or header is needed.
- Click Connect: the Tino sign-in page opens (see Signing in and granting access).
Depending on the Claude plan, an organization admin may need to enable the connector first.
Claude Code
Install the tino plugin:
claude plugin marketplace add tinovn/tino-connector-mcpclaude plugin install tino@tinovnIn Claude Code, type /mcp, select tino, and click Authenticate. Without the plugin, add the MCP server directly, then also run /mcp → Authenticate:
claude mcp add --transport http tino https://api.tino.vn/mcpClaude Code does not register a client: it identifies itself with a Client ID Metadata Document (client_id=https://claude.ai/oauth/claude-code-client-metadata). By default Claude Code requests every scope the MCP server lists, write scopes included; for narrower access, use a personal API token (see Other MCP apps).
ChatGPT
ChatGPT accounts with Developer mode enabled can add a custom MCP connector: URL https://api.tino.vn/mcp, OAuth authentication. The exact steps depend on the version of the ChatGPT interface.
Other MCP apps (Cursor, VS Code, n8n…)
Main option: OAuth sign-in. An MCP client that supports OAuth as the MCP specification describes registers itself with Tino, then opens the sign-in page; you only enter the URL https://api.tino.vn/mcp, with no client ID, secret or header:
- Calling
https://api.tino.vn/mcpwithout a token returns HTTP 401; theWWW-Authenticateheader points to the metadata athttps://api.tino.vn/.well-known/oauth-protected-resource. - The client reads the discovery document
https://api.tino.vn/.well-known/oauth-authorization-serverand registers itself at theregistration_endpoint(POST https://api.tino.vn/oauth/register, RFC 7591): a public client (token_endpoint_auth_method: none) redirecting tohttp://localhostor127.0.0.1(any port) orhttps://. Field rules are in Sign in from a CLI. - The client opens the Tino sign-in page (Authorization Code + PKCE, see Sign in with Tino); the customer approves as described in Signing in and granting access.
On the Authorized apps page, a self-registered app appears under the name it registered (client_name).
Alternative: personal API token. Use it when the app does not support MCP OAuth, runs on a server that cannot open a browser, or needs narrower scopes or an IP restriction:
- Create a token at
https://auth.tino.vn/en/me/security, in the API tokens section: choose exactly the scopes you need; if the app runs on a fixed server, restrict the token to its IP. See Personal API tokens. - Configure the MCP server in the app: URL
https://api.tino.vn/mcp, headerAuthorization: Bearer <token>. A common JSON configuration format:
{
"mcpServers": {
"tino": {
"type": "http",
"url": "https://api.tino.vn/mcp",
"headers": { "Authorization": "Bearer tinopat_…" }
}
}
}The token is a key to the account: do not paste it into the chat, do not commit it to Git; if it leaks, revoke it immediately on the API tokens page.
Signing in and granting access
When you connect, the browser opens a Tino page: the customer signs in as usual (OTP code by email or phone number, Google, Zalo or passkey), reviews the list of scopes the app requests, then clicks Approve. The app receives a time-limited access token (24 hours by default) and a refresh token to renew it automatically; if the refresh token is not used before it expires (30 days by default), the customer must reconnect.
Approving grants every scope in the list. For narrower access, use a personal API token with only the scopes you need.
Scopes and tools
Each tool is a route of the /v1 gateway (see Calling the Tino API); a tool's description ends with its route and scope, for example GET /details · scope profile:read. tools/list returns only the tools the token can call, so the assistant does not see tools outside the granted scopes.
| Scope (label on the consent page) | What the assistant can do |
|---|---|
| View account details | Profile (without ID documents, phone number, address, tax and bank details), notifications |
| Edit account details | Mark notifications as read |
| View services, including service login details | List and details of services and VPS, resources, SSL certificates; may include service login passwords |
| Manage your services | Start, shut down, restart VPS, change hostname, renew, order SSL certificates |
| View domains | Domain details, nameservers, transfer lock, auto-renewal |
| Manage your domains | Change nameservers, order, renew, turn locks on or off, forwarding |
| View DNS records | Read DNS zones and records |
| Edit DNS records | Add, edit, delete DNS zones and records |
| View invoices and payments | Invoices, balance, transaction history |
| Make payments and top up | Pay invoices with the Tino account balance, create top-up requests |
| View support tickets | View tickets |
| Create and reply to tickets | Create, reply to, close, reopen tickets |
| View TinoPay: receiving accounts, transactions, webhooks | Merchant details, bank accounts, virtual accounts, transactions and totals, webhooks and their delivery log, notification apps, payment code patterns, Sapo integrations and their reconciliation log |
| Manage TinoPay: virtual accounts, webhooks, notifications, Sapo integration | Create, activate, deactivate, delete virtual accounts; add, edit, delete and resend webhooks; Telegram, Zalo, Lark notification apps; Sapo integrations; edit the merchant and payment code patterns |
| View TinoPage Builder websites | Service overview, list and details of websites, status of a running website creation, custom domains, contacts and orders |
| Manage TinoPage Builder websites: create, publish, custom domains | Create websites with AI, publish, pause, delete websites; add, check DNS of, remove custom domains |
| View websites protected by TinoWAF and the event log | Service overview, websites, domain names and the DNS records to set, origin servers, event log and summary, IP block/allow list |
| Manage TinoWAF: websites, protection level, origin servers, IP rules | Add, delete websites; change the protection level, turn emergency anti-attack mode on or off; add, remove domain names, check DNS; edit origin servers; block or allow IPs |
| Keep access while you're offline | Keep the connection (renew the access token automatically) |
Tools with a read scope carry the annotation readOnlyHint: true; tools with a write scope carry destructiveHint: true. The tools for email forwarding, domain forwarding, registering private nameservers and getting payment content from a payment gateway also carry openWorldHint: true (they affect external systems).
Not available through MCP
- Cancelling services: only on the Tino customer control panel; MCP has no cancel tool, even when the token has the service management scope.
- Getting the domain transfer code (EPP), changing the domain registrant: never granted to Claude, ChatGPT or any OAuth app. Only a personal API token with the
domains:ownerscope (IP restriction required) has these two tools; choose that scope only when you really need it. - Creating TinoPay API tokens, linking receiving bank accounts: likewise, only a personal API token with the
tinopay:ownerscope (IP restriction required) has these tools. - Ordering new hosting or VPS: not supported yet. Ordering domains and SSL certificates is supported.
Example requests
- "List my Tino services and their renewal dates."
- "Which nameservers does example.vn use?"
- "Add an A record
wwwpointing to 203.0.113.10 for example.vn." - "Do I have any unpaid invoices?"
- "Restart the VPS with hostname web01." (write action: the assistant should ask for confirmation first)
Safety and data
- Every change (orders, renewals, payments, DNS or nameserver changes, VPS restarts) is marked as a write action; the MCP server also tells the assistant to state what it will do and wait for the customer's approval. The confirmation step is done by Claude or ChatGPT according to the app's settings: keep the ask-before-running mode on and read the details carefully before approving.
- The assistant only reads and writes through Tino's API within the granted scopes; results are sent to Claude or ChatGPT to answer the customer.
- The MCP server filters identity fields out of every person record (objects with
emailplusfirstname,lastnameorname: accounts, contacts, domain registrants) before sending them to the assistant: ID document numbers, date of birth, gender, phone number, address, tax code, household business code, bank, Zalo link, IP and sign-in times. Calling the/v1gateway directly returns the response unchanged (see Calling the Tino API). - Privacy policy · Terms of use.
Revoking access
The customer goes to https://auth.tino.vn/en/me/apps (Authorized apps) and clicks Revoke on "Claude", "Claude Code", "ChatGPT" or the name of a self-registered MCP app: every token of that app stops working immediately. Personal API tokens are revoked at https://auth.tino.vn/en/me/security, in the API tokens section.
Troubleshooting
| Symptom | Fix |
|---|---|
| Claude Code says authentication is needed (Needs authentication) | Type /mcp, select tino, click Authenticate |
| The connection works for a while, then asks you to sign in again | Reconnect: the refresh token expired after a long time without use, or the customer revoked access |
| The Tino sign-in page says the app is invalid | Send a screenshot to support@tino.vn |
| Another MCP app cannot sign in | The app must support MCP OAuth (client self-registration); if it does not, or it runs on a server that cannot open a browser, use a personal API token (see Other MCP apps) |
Self-registration returns 429 too_many_requests | Each IP can register at most 10 times per hour: the client should store its registered client_id and reuse it |
| With a personal token, the assistant does not see a tool it needs | The token lacks that scope: create a new token with the required scopes |
The assistant reports insufficient_scope | The tool does not apply to that resource with the granted scopes, for example a VPS command on a hosting plan |
HTTP 403 ip_not_allowed | The personal token has an IP restriction and is being used from another IP |
| No command to cancel services | By design: cancel on the Tino control panel |
For MCP client developers
Try it with a personal API token ($TINO_TOKEN). Each message is one JSON-RPC 2.0 POST; with no token or a wrong token you get HTTP 401 with the header WWW-Authenticate: Bearer error="invalid_token", scope="…", resource_metadata="https://api.tino.vn/.well-known/oauth-protected-resource" so the client can start OAuth.
curl -X POST https://api.tino.vn/mcp \
-H "Authorization: Bearer $TINO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'Calling a tool: the route's path parameters are required arguments; other arguments go into the query (GET, DELETE) or the body (POST, PUT).
curl -X POST https://api.tino.vn/mcp \
-H "Authorization: Bearer $TINO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "service_details", "arguments": {"id": "100001"}}}'- Supported methods:
initialize,ping,tools/list,tools/call; messages without anid(notifications) get HTTP 202. - The result of
tools/callis the route's response: JSON astext, withisError: truewhen the route reports an error (HTTP 4xx, 5xx or anerrorfield); files (for example invoice PDFs) are returned as an embedded base64resource. - Tool names are lowercase with underscores (
get_details,service_details,dns_add_record…) and may change when the API adds routes; get the list withtools/listinstead of hard-coding it.