Text & Number Toolkit MCP
Provides deterministic text and number processing tools including amount-to-words conversion with Arabic cheque grammar, number formatting in 56 languages, CLDR parsing, digit conversion, Arabic normalization, transliteration, script detection, and date parsing across 200 locales plus Hijri calendar support.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://textkit.noahsarch.tech/mcpWhat you can do with it
- Convert monetary amounts to words with correct Arabic cheque grammar
- Format and parse numbers using CLDR standards for 56 languages
- Detect script and transliterate text between Arabic and Latin
- Parse dates in 200 locales including Hijri calendar conversions
Source and maintenance
Protocol and capabilities
- Server
- text-number-toolkit 0.1.0
- MCP protocol
- 2025-06-18
- Tools
- 10 advertised
- Resources
- 2 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
10 advertised
amount_to_words — Write a money amount in words
Convert an amount in a currency to words for cheques, invoices and contracts, in 56 languages. Arabic output applies number–noun agreement (درهم واحد / درهمان / ثلاثة دراهم / أحد عشر درهماً) and the correct minor unit (فلس، هللة، قرش…); English uses CLDR currency names. style='cheque' adds the customary wrapper. Example: amount 1250.50, currency 'AED', language 'ar', style 'cheque'. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "amount_to_wordsArguments",
"required": [
"amount",
"currency"
],
"properties": {
"style": {
"enum": [
"plain",
"cheque"
],
"type": "string",
"title": "Style",
"default": "plain",
"description": "cheque wraps the phrase the way cheques/contracts do ('… only' / 'فقط … لا غير')."
},
"amount": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "integer"
}
],
"title": "Amount",
"description": "Amount as number or numeric string, e.g. 1234567.89 or '١٢٣٤٫٥٠'."
},
"currency": {
"type": "string",
"title": "Currency",
"description": "ISO 4217 code: AED, SAR, USD, EUR…"
},
"language": {
"type": "string",
"title": "Language",
"default": "en",
"description": "Language of the words: 'en', 'ar', 'fr', 'de', 'es', 'hi', 'ur'… (56 languages; list_languages)."
}
}
}{
"type": "object",
"title": "amount_to_wordsDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}number_to_words — Write a number in words
Cardinal, ordinal or year wording of a number in 56 languages (en, ar, fr, de, es, pt, it, nl, tr, ru, hi, ur, id, ja, ko…). Example: number 2026, language 'en', to 'year' → 'twenty twenty-six'. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "number_to_wordsArguments",
"required": [
"number"
],
"properties": {
"to": {
"enum": [
"cardinal",
"ordinal",
"year"
],
"type": "string",
"title": "To",
"default": "cardinal",
"description": "cardinal (default) | ordinal (1st, الأول) | year (nineteen ninety-nine)."
},
"number": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "integer"
}
],
"title": "Number",
"description": "Number (integers or decimals; Arabic-Indic digits accepted)."
},
"language": {
"type": "string",
"title": "Language",
"default": "en",
"description": "Target language code (56 supported)."
}
}
}{
"type": "object",
"title": "number_to_wordsDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}format_number — Format a number for a locale
Locale-correct display of a decimal, currency amount or percentage using CLDR rules: grouping (1,234,567 / 12,34,567 / 1.234.567 / 1 234 567), decimal mark, currency symbol placement, Arabic-Indic digits for ar_* locales. Example: number 1234567.891, locale 'en_IN', style 'currency', currency 'INR'. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "format_numberArguments",
"required": [
"number",
"locale"
],
"properties": {
"style": {
"enum": [
"decimal",
"currency",
"percent"
],
"type": "string",
"title": "Style",
"default": "decimal",
"description": ""
},
"locale": {
"type": "string",
"title": "Locale",
"description": "CLDR locale: 'en', 'en_IN' (lakh grouping), 'ar_AE' (Arabic-Indic digits), 'de_DE', 'fr_CH'…"
},
"number": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "integer"
}
],
"title": "Number",
"description": "Number to format."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency",
"default": null,
"description": "ISO 4217 code when style=currency."
},
"decimals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Decimals",
"default": null,
"description": "Force a number of decimal places; default = locale/currency rule."
},
"numbering": {
"enum": [
"locale",
"latn",
"arab"
],
"type": "string",
"title": "Numbering",
"default": "locale",
"description": "Digit system: locale default (ar_EG → Arabic-Indic, ar_AE → Western), or force latn / arab."
}
}
}{
"type": "object",
"title": "format_numberDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}parse_number — Read a human-written number
Turn '1.234,56', '١٬٢٣٤٫٥٦', '12 345,6' or '1,234.56' into an exact decimal, using the locale's separators first and a clearly flagged heuristic when they do not match. Example: text '1.234,56', locale 'de'. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "parse_numberArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "Number as written by a human: '1.234,56', '١٬٢٣٤٫٥٦', '12 345,6', '1,234.56'."
},
"locale": {
"type": "string",
"title": "Locale",
"default": "en",
"description": "Locale whose separators to assume first; a heuristic fallback handles mismatches and says so."
}
}
}{
"type": "object",
"title": "parse_numberDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}convert_digits — Convert digit systems
Rewrite digits between Western (0-9), Arabic-Indic (٠-٩) and Persian/Urdu (۰-۹) anywhere in a text, leaving everything else untouched. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "convert_digitsArguments",
"required": [
"text",
"to"
],
"properties": {
"to": {
"enum": [
"western",
"arabic_indic",
"persian"
],
"type": "string",
"title": "To",
"description": "western 0-9 | arabic_indic ٠-٩ | persian ۰-۹."
},
"text": {
"type": "string",
"title": "Text",
"description": ""
}
}
}{
"type": "object",
"title": "convert_digitsDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}normalize_arabic — Normalise Arabic text
Clean Arabic text for matching, search and storage: strip diacritics and tatweel, unify alef forms, optional ة→ه and ى→ي, Western digits, Latin punctuation, whitespace. Reports exactly which rules changed the text. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "normalize_arabicArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": ""
},
"unify_alef": {
"type": "boolean",
"title": "Unify Alef",
"default": true,
"description": "آ أ إ ٱ → ا."
},
"strip_tatweel": {
"type": "boolean",
"title": "Strip Tatweel",
"default": true,
"description": "Remove kashida/tatweel elongation."
},
"strip_tashkeel": {
"type": "boolean",
"title": "Strip Tashkeel",
"default": true,
"description": "Remove diacritics (fatha, damma, shadda…)."
},
"digits_to_western": {
"type": "boolean",
"title": "Digits To Western",
"default": true,
"description": "٠-٩/۰-۹ → 0-9."
},
"taa_marbuta_to_haa": {
"type": "boolean",
"title": "Taa Marbuta To Haa",
"default": false,
"description": "ة → ه (search normalisation; changes spelling)."
},
"alef_maqsura_to_yaa": {
"type": "boolean",
"title": "Alef Maqsura To Yaa",
"default": false,
"description": "ى → ي (search normalisation; changes spelling)."
},
"collapse_whitespace": {
"type": "boolean",
"title": "Collapse Whitespace",
"default": true,
"description": ""
},
"punctuation_to_latin": {
"type": "boolean",
"title": "Punctuation To Latin",
"default": false,
"description": "، ؛ ؟ ٪ ٫ ٬ → , ; ? % . ,"
}
}
}{
"type": "object",
"title": "normalize_arabicDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}transliterate — Romanise any script to ASCII
Deterministic romanisation of any script to plain ASCII (Cyrillic, Greek, CJK, Devanagari, Thai, Arabic…) for slugs, sorting, matching and systems that reject non-ASCII. Not an official spelling: for Arabic names the result is a consonant skeleton and is flagged low confidence. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "transliterateArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "Text in any script (Cyrillic, Greek, CJK, Arabic, Devanagari…)."
}
}
}{
"type": "object",
"title": "transliterateDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}detect_script — Detect scripts, direction and digit systems
Proportions of writing systems in a text (latin, arabic, cyrillic, han…), dominant script, RTL/LTR direction, mixed-script flag, which digit systems appear, and hints such as Persian/Urdu-specific letters. Free. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "detect_scriptArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": ""
}
}
}{
"type": "object",
"title": "detect_scriptDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}parse_date — Parse a human-written date (200 locales + Hijri)
Turn a date written in natural language or local numeric formats into an ISO date/datetime: '3 mars 2026', '12.11.2026', 'next month', 'غداً', 'in 3 weeks', and Hijri dates such as '15 رمضان 1447' or '1 Muharram 1448' (converted by Umm al-Qura). Returns precision (day/month/year/time), the detected language and the relative base used. Pass languages and date_order when known. Example: text '١٥ رمضان ١٤٤٧'. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "parse_dateArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "A date as humans write it: '3 mars 2026', '12/11/2026', 'غداً', 'in 3 weeks', '15 رمضان 1447', '2026-11-12T10:00'."
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Timezone",
"default": null,
"description": "IANA zone for the result, e.g. 'Asia/Dubai'."
},
"languages": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Languages",
"default": null,
"description": "Language codes to try, e.g. ['en','ar','fr']. Strongly recommended for speed and accuracy."
},
"date_order": {
"anyOf": [
{
"enum": [
"DMY",
"MDY",
"YMD"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Date Order",
"default": null,
"description": "Order for ambiguous numeric dates. Pass it whenever you know the source country."
},
"prefer_future": {
"type": "boolean",
"title": "Prefer Future",
"default": false,
"description": "Resolve ambiguous relative dates forward (deadlines) rather than backward."
},
"relative_base": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Relative Base",
"default": null,
"description": "ISO datetime that relative phrases ('tomorrow', 'in 3 days') count from. Default: now."
}
}
}{
"type": "object",
"title": "parse_dateDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_languages — Supported languages and locales
Languages available for words, the curated Arabic-grammar currencies, and notes on locales. Free. Response: result plus data_confidence, estimated_items[], sources[], data_version, warnings[]; deterministic (no AI inside), nothing logged.
{
"type": "object",
"title": "list_languagesArguments",
"properties": {}
}{
"type": "object",
"title": "list_languagesDictOutput",
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
0 advertised
Resources
2 advertised
data_version — Data version
Current data/rules version.
text-number-toolkit://data-versionmetrics — Aggregate metrics
Aggregate counters only (tool, status, latency bucket). No queries are logged.
text-number-toolkit://metrics30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 2211 ms
- 95th percentile latency
- 2211 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 2211 ms · metadata changed · 10 tool(s), 2 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http text-number-toolkit-mcp https://textkit.noahsarch.tech/mcpCodex
codex mcp add text-number-toolkit-mcp --url https://textkit.noahsarch.tech/mcpCursor
{
"mcpServers": {
"text-number-toolkit-mcp": {
"url": "https://textkit.noahsarch.tech/mcp"
}
}
}Cline
{
"mcpServers": {
"text-number-toolkit-mcp": {
"type": "streamableHttp",
"url": "https://textkit.noahsarch.tech/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"text-number-toolkit-mcp": {
"type": "http",
"url": "https://textkit.noahsarch.tech/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http text-number-toolkit-mcp https://textkit.noahsarch.tech/mcpClaude Desktop
{
"mcpServers": {
"text-number-toolkit-mcp": {
"url": "https://textkit.noahsarch.tech/mcp"
}
}
}Windsurf
{
"mcpServers": {
"text-number-toolkit-mcp": {
"serverUrl": "https://textkit.noahsarch.tech/mcp"
}
}
}Let your agent find its tools
Find servers like Text & Number Toolkit MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Text & Number Toolkit MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.