mcpField
W
worldref

worldref

本地服务
github.com/arj-89地图与出行01 天前更新

关于 worldref

worldref 是面向应用和表单开发者的国家数据库,提供阿拉伯语优先的名称、搜索和电话验证,并支持多种语言与数据格式。

主要功能

  1. 01阿拉伯语和英语国家数据
  2. 02适配阿拉伯语的搜索与排序
  3. 03电话解析与验证
  4. 04地址、货币和地区设置字段
  5. 05提供 JSON、CSV、SQL 和多语言包

适用场景

  1. 01构建本地化国家选择器
  2. 02验证并格式化国际电话号码
  3. 03为国家及行政区数据库表导入初始数据

MCP 相关

可通过 `npx -y worldref mcp` 启动 MCP 服务,为 AI Agent 提供 worldref 数据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"arj-89-worldref": {
"command": "npx",
"args": [
"-y",
"worldref"
]
}
}
}
启动命令npx -y worldref

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmworldref1.2.1

工具

4

收录的工具列表 · 更新于 1 天前

参数类型必填说明
iso2string是ISO 3166-1 alpha-2 代码,例如 SA。科索沃使用 XK。
langenum否返回字段的语言。默认值:两种语言。ar | en | both

详细介绍

worldref

**用阿拉伯语、英语或两种语言呈现所有国家的信息:**名称、国籍、首都、货币、语言、时区、拨号代码、电话验证、地址格式和行政区划。一个数据集,可用于 JSON、CSV、SQL、TypeScript、Python、Swift、Kotlin、Dart、PHP、Go 和 C#,也适用于 AI Agent(MCP)。

العربية · 网站和搜索演示 · 最佳实践 · 字段参考 · 数据来源

CI npm PyPI pub.dev NuGet Packagist MCP Registry countries subdivisions languages

import { countries, search, parsePhone, byIso2 } from "worldref";

byIso2("SA").name_ar;                       // "السعودية"
byIso2("SA").nationality.nationality_ar_f;  // "سعودية"
search(countries, "الامارات", "ar")[0].iso2; // "AE"  (ignores «ال», hamza and tashkeel)
parsePhone("٠٥٠١٢٣٤٥٦٧", byIso2("SA"));     // { e164: "+966501234567", valid: true, mobile: true, ... }

为什么选择 worldref

  • **原生支持阿拉伯语。**提供常用简称(السعودية,而非音译)、阳性和阴性国籍称谓(سعودي / سعودية);搜索时会忽略「ال」、附标元音符号、延长符和不同形式的 hamza;支持在任何地方使用阿拉伯-印度数字和波斯数字;排序键可在所有平台实现正确的阿拉伯语字母顺序。
  • **支持单语或双语。**每个文件都提供三种构建版本:双语版(name_ar、name_en)、仅阿拉伯语版(name)和仅英语版(name)。
  • **可用的电话字段。**涵盖每个国家的拨号代码、有效号码长度、手机前缀和精确验证模式;解析共享拨号代码(+1、+7、+44……),并支持输出国际格式(E.164)。
  • **表单或应用所需信息一应俱全:**官方名称、首都、带符号的货币(包括新的沙特里亚尔符号)、官方语言、每周起始日和周末、首选历法(包括 Umm al-Qura)、邮政编码规则、地址模板、紧急电话号码、插头类型和电压、FIFA 和 IOC 代码,以及 ISO 3166-2 行政区划。
  • **数据有据可查,而非凭空猜测。**优先采用官方来源(Unicode CLDR、Google libphonenumber、世界银行、IANA、ITU 和政府来源)。每列的来源都列于 data/sources.json。缺失值记为 null,绝不猜测或使用机器翻译。

安装

已发布到 npm、PyPI、pub.dev、Packagist、NuGet 和 MCP Registry。Swift、Kotlin 和 Go 可直接从此仓库安装。

技术栈安装方式
JavaScript、TypeScript(Web、Node 20.10+、React Native、Bun、Deno)npm i worldref
CDN(无需构建)https://cdn.jsdelivr.net/npm/[email protected]/data/worldref.json
Swift(iOS、macOS)Swift Package Manager:https://github.com/arj-89/worldref,版本从 1.1.2 起,产品为 WorldRef
Kotlin、AndroidJitPack:maven("https://jitpack.io"),然后执行 implementation("com.github.arj-89:worldref:v1.1.2")
Pythonpip install worldref
Dart、Flutterdart pub add worldref(Flutter:flutter pub add worldref)
PHP、Laravelcomposer require arj-89/worldref
Gogo get github.com/arj-89/worldref/[email protected]
C#、.NETdotnet add package WorldRef
任意语言JSON、CSV 和 SQL(Postgres、MySQL、SQLite),位于 data/ 和发布页面
AI AgentMCP 服务:npx -y worldref mcp(在 MCP Registry 中的条目为 io.github.arj-89/worldref)
无需安装单个国家:https://arj-89.github.io/worldref/api/v1/sa.json

每个语言文件夹都有自己的 README 和使用示例:python、Swift、kotlin、dart、php、go、csharp。

只使用所需内容

  • 数据拆分为多个共享 iso2 键的模块:core、nationality、phone、currency、geo、locale、address、travel、sports,以及 subdivisions。可在 data/modules/ 中找到。
  • 每个模块提供 3 种构建版本:.json(阿拉伯语和英语)、.ar.json(仅阿拉伯语)、.en.json(仅英语)。
  • **JS/TS:**仅导入所用模块,打包工具也只会打包该文件:
    import phone from "worldref/data/modules/phone.json" with { type: "json" };
    import { parsePhone } from "worldref/helpers";
    
  • **其他语言:**只加载所需的模块文件。data/worldref.json 包含全部数据。
  • 单个国家,无需安装:https://arj-89.github.io/worldref/api/v1/{iso2}.json。
  • 缺失值为 null(或空列表)。请将其视为未知值,切勿自行填入。
  • 在同一主版本中,字段不会重命名或移除。

使用示例

国家选择器(先显示用户所在国家,再按界面语言的字母顺序排列):

import { countries, sortCountries, search } from "worldref";
const list = sortCountries(countries, "ar", "SA");          // السعودية first, then Arabic order
const hits = search(countries, userQuery, "ar");            // names, aliases, ISO codes, +966 / 00966 / 966

显示:旗帜、界面语言的国家名称,然后是拨号代码。在阿拉伯语界面中,将拨号代码隔离为从左向右书写(<bdi dir="ltr">+966</bdi>)。

电话字段(存储国际格式号码,以及用户选择的国家):

const p = parsePhone(input, byIso2(pickedIso2), countries);
if (p?.valid && p.mobile) save({ phone: p.e164, phone_country: p.iso2 });

国籍字段(仅显示有国籍信息的条目:国家,以及台湾、香港和澳门):

const options = countries.filter((c) => c.nationality.nationality_en);
const label = (c, female) => (female ? c.nationality.nationality_ar_f : c.nationality.nationality_ar_m);

**数据库初始化:**运行 data/sql/postgres.sql(或 mysql.sql、sqlite.sql)。该脚本会创建 countries 和 subdivisions。

最佳实践

以下规则已内置于全部八个软件包的辅助函数中,并由 tests/vectors.json 中的共享测试锁定。请使用这些辅助函数;如果自行编写,请严格遵循这些规则。

搜索(normalize()、search())

  • 对查询和名称两侧采用相同的规范化方式。
  • 阿拉伯语:删除每个词开头的「ال」(不只是第一个词);移除 tashkeel(fatha、damma、kasra、sukun、shadda、tanween)和 tatweel(ـ);将 أ إ آ ٱ 视为 ا,将 ة 视为 ه,将 ى 视为 ي,将 ؤ 视为 و,将 ئ 视为 ي。因此,「الإمارات」、「امارات」和「الأمارات」都能找到阿联酋。
  • 拉丁文字:忽略大小写和重音符号,并将标点视为空格,因此「cote d'ivoire」能找到 Côte d’Ivoire。
  • 数字:在进行任何其他处理前,先将阿拉伯-印度数字(٠١٢٣٤٥٦٧٨٩)和波斯数字(۰۱۲۳۴۵۶۷۸۹)转换为西方数字。
  • 匹配两种语言的名称和别名、ISO 代码(SA、SAU),以及带或不带「+」或「00」的拨号代码(+966、00966、966)。

排序(sortCountries())

  • 优先显示用户所在国家:先取用户资料中的国家,否则取设备地区;若两者都没有,则不固定任何国家。
  • 然后按 sort_ar 或 sort_en 使用普通字符串比较排序。不要使用区域排序规则(Intl.Collator("ar")、localizedStandardCompare):它们都不会忽略「ال」,因此所有以「ال」开头的名称都会聚在 ا 下。

显示

  • 依次显示旗帜、界面语言对应的名称和拨号代码。
  • 在阿拉伯语界面中,将拨号代码和任何拉丁文字隔离,并在界面中从左到右显示(<bdi dir="ltr">+966</bdi>,或 U+2066 ... U+2069)。数据中不包含双向文本标记。
  • 在两种语言的界面中都使用西方数字(0-9)。
  • 网页端使用 flag_svg:Windows 不会绘制旗帜表情符号。
  • 货币:显示 symbol(沙特里亚尔符号为 U+20C1);若字体不支持这个新符号,则回退为 symbol_fallback(ر.س)。

电话字段(parsePhone()、formatNational())

  • 接受用户输入的任何格式:阿拉伯或西方数字、空格、连字符、开头的 0、「+」或「00」。
  • 将国际格式(e164)与用户选择的 iso2 一起存储。共享拨号代码(+1、+7、+44、+599……)无法仅凭号码还原到某个国家。
  • 使用 mobile_pattern 验证手机号码。对于 mobile_distinguishable 为 false 的地区(美国、加拿大),不要仅因号码看起来不像手机号码而拒绝。
  • 使用 formatNational() 格式化显示号码(如 5X XXX XXXX)。

国籍字段

  • 仅列出 nationality.nationality_en 不为 null 的行(国家,以及台湾、香港和澳门)。
  • 阿拉伯语中使用与个人性别相符的形式:nationality_ar_m(سعودي)或 nationality_ar_f(سعودية)。

数据

  • null(或空列表)表示未知。应显示为未知;绝不要从其他来源补全。
  • 仅加载所需模块;这些模块通过 iso2 关联。
  • 固定版本(#v1.1.2、@1.1.2),避免名称和规则发生变化。

数据政策

  • 此数据集不包含以任何名称或代码表示的以色列,任何文件中都没有。每次输出都会由测试强制检查这一点。
  • 巴勒斯坦为「فلسطين」/“Palestine”,是一个国家,首都为「القدس」/“Jerusalem”。此处 +970 和 +972 的号码(包括耶路撒冷和 1948 年地区的线路)均为巴勒斯坦号码。其货币为约旦第纳尔和谢克尔(显示为「شيكل」/“Shekel”)。
  • **有争议地区遵循沙特阿拉伯的官方立场:**西撒哈拉属于摩洛哥(不单独列项),包含科索沃,不包含北塞浦路斯;台湾、香港和澳门为拥有国籍的领土(它们签发自己的护照)。
  • 对此政策的修改请求将直接关闭,不予讨论。欢迎提供带来源链接的数据更正(请参阅 CONTRIBUTING)。

字段

单语言构建会移除 _ar / _en 后缀(name_ar 在 .ar.json 中会变为 name)。

字段模块示例(SA)含义
iso2allSAISO 3166-1 alpha-2 代码(科索沃为 XK)。用于关联所有模块的键。
iso3coreSAUISO 3166-1 alpha-3 代码(按照 CLDR,科索沃为 XKK)。
iso_numericcore682ISO 3166-1 数字代码,以文本形式保存以保留前导零。
kindcorecountry国家(主权国家,包括巴勒斯坦、梵蒂冈和科索沃)或地区。
name_arcoreالسعودية阿拉伯语常用简称。
name_encoreSaudi Arabia英语常用简称。
official_name_arcoreالمملكة العربية السعودية来源中有记载时提供的阿拉伯语官方全称。
official_name_encoreKingdom of Saudi Arabia来源中有记载时提供的英语官方全称。
aliases_arcore["المملكة العربية السعودية","المملكة"...人们搜索时使用的其他阿拉伯语名称。仅用于搜索,不用于显示。
aliases_encore["KSA","Kingdom of Saudi Arabia","Sau...人们搜索时使用的其他英语名称。仅用于搜索,不用于显示。
flagcore🇸🇦国旗表情符号(区域指示符对)。Windows 无法绘制这些表情符号;在网页上请使用 flag_svg。
flag_svgcoreflags/sa.svg此软件包中 4:3 SVG 国旗的路径。
continentcoreasiaafrica、americas、asia、europe 或 oceania(通过 CLDR 获取的联合国 M49 数据)。
groupscore["gcc","arab_league"]所属组织:gcc、arab_league。
un_membercoretrue193 个联合国会员国的值为 true。
tldcore.sa已委派时提供的国家/地区代码顶级域名。
sort_arcoreسعوديه阿拉伯语排序键:使用普通字符串比较即可获得正确的阿拉伯语顺序(忽略「ال」、hamza 形式和 tashkeel)。
sort_encoresaudi arabia英语排序键:使用普通字符串比较即可。
nationalitynationality国籍名称。国家以及 TW、HK、MO 有值;其他地区为 null。
nationality.nationality_ar_mnationalityسعودي阿拉伯语国籍称谓,阳性(سعودي)。
nationality.nationality_ar_fnationalityسعودية阿拉伯语国籍称谓,阴性(سعودية)。
nationality.nationality_ennationalitySaudi英语国籍形容词(Saudi)。
nationality.icao_codenationalitySAU护照上使用的 ICAO Doc 9303 代码(通常与 iso3 相同;德国为 D,科索沃为 RKS)。
phonephone[{"calling_code":"+966","leading_digi...此行对应的编号计划。大多数行只有一个;部分行有多个(巴勒斯坦:+970 和 +972)。
phone[].calling_codephone+966带 + 的国际电话区号。
phone[].leading_digitsphonenull当多个国家/地区共用区号时,国家号码必须以此正则表达式匹配的数字开头(例如,多米尼加共和国的 +1 809|829|849)。若区号没有以这种方式共用,则为 null。
phone[].primaryphonetrue当此行对应区号的默认国家/地区时,值为 true。
phone[].trunk_prefixphone0拨打国际区号前需从本地号码中去掉的数字(如 0501234567 中的 0)。
phone[].patternphone(?:[15]\d|800|92)\d{7}任何有效国家号码(所有类型)的正则表达式。需与完整国家号码匹配。
phone[].lengthsphone[9,10]有效国家号码的长度,涵盖所有类型。
phone[].mobile_patternphone579[0-8]\d{5}|5(?:[013-689]\d|7[0-8])...有效手机国家号码的正则表达式。需与完整国家号码匹配。
phone[].mobile_lengthsphone[9]有效手机国家号码的长度。
phone[].mobile_prefixesphone["50","51","53","54","55","56","57","...手机号码的前导数字(最多 3 位)。用于快速检查;精确验证请使用 mobile_pattern。
phone[].mobile_distinguishablephonetrue当手机号码和固定电话号码看起来相同时为 false(美国、加拿大)。
phone[].mobile_examplephone512345678手机国家号码示例,可用作输入占位符。
phone[].mobile_formatphone## ### ####手机国家号码的显示分组格式,# 表示数字。
currenciescurrency[{"code":"SAR","name_ar":"ريال سعودي"...使用中的货币。
currencies[].codecurrencySARISO 4217 代码。
currencies[].name_arcurrencyريال سعودي阿拉伯语货币名称。
currencies[].name_encurrencySaudi Riyal英语货币名称。
currencies[].symbolcurrency⃁货币符号(存在时使用新的 Unicode 符号,例如里亚尔符号)。
currencies[].symbol_arcurrencyر.س.阿拉伯语书写的货币符号(ر.س)。
currencies[].symbol_fallbackcurrencyر.س字体不支持新符号时显示的文本。
geogeo地理信息。
geo.capital_argeoالرياض阿拉伯语首都名称。
geo.capital_engeoRiyadh英语首都名称。
geo.latgeo23.7167国家中心点的纬度。
geo.lnggeo44.1167国家中心点的经度。
geo.area_km2geo2149690面积,单位为平方公里。
geo.populationgeo36973555人口。
geo.population_yeargeo2025人口数据的年份。
geo.timezonesgeo["Asia/Riyadh"]IANA 时区名称。
geo.driving_sidegeorightleft 或 right。
localelocale区域惯例。
locale.languageslocale[{"code":"ar","name_ar":"العربية","na...官方语言,按使用人数从多到少排列。
locale.languages[].codelocalearBCP 47 语言代码。
locale.languages[].name_arlocaleالعربية阿拉伯语语言名称。
locale.languages[].name_enlocaleArabic英语语言名称。
locale.week_startlocalesun一周的第一天(sun、mon、sat 等)。
locale.weekendlocale["fri","sat"]周末日期。
locale.calendarslocale["gregorian","islamic-umalqura","isla...使用中的历法,按首选程度从高到低排列(gregorian、islamic-umalqura 等)。
locale.measurementlocalemetricmetric、us 或 uk。
addressaddress邮政地址惯例。
address.postal_code_formataddress#####邮政编码格式:# 表示数字,@ 表示字母。
address.postal_code_regexaddress^(?:\d{5})$有效邮政编码的正则表达式。
address.postal_code_exampleaddress11564邮政编码示例。
address.address_formataddress%N%n%O%n%A%n%C %Z地址模板:%N 姓名,%O 组织,%A 街道,%D 区,%C 城市,%S 地区,%Z 邮政编码,%X 排序码,%n 换行。
address.region_label_araddressnull阿拉伯语中顶级地区的称谓。
address.region_label_enaddressnull顶级地区的称谓(州、省、酋长国等)。
traveltravel旅行信息。
travel.emergencytravel经官方来源确认的紧急电话号码。服务项为 null 时,请拨打 general。
travel.emergency.policetravel999警察。
travel.emergency.ambulancetravel997救护车。
travel.emergency.firetravel998消防和民防。
travel.emergency.generaltravel911全部服务通用号码(112、911、999 等)。
travel.plug_typestravel["G"]IEC 插头字母类型(A 至 N)。
travel.voltagetravel[220,230]住宅市电电压。
travel.frequency_hztravel[60]市电频率,单位为赫兹。
sportssports体育代码。
sports.fifasportsKSAFIFA 国家代码。
sports.iocsportsKSAIOC 国家代码。
subdivisions.iso2subdivisionsSA国家/地区代码。
subdivisions.codesubdivisionsSA-01ISO 3166-2 代码(SA-01)。
subdivisions.name_arsubdivisionsمنطقة الرياض阿拉伯语名称。
subdivisions.name_ensubdivisionsRiyadh英语名称。
subdivisions.parentsubdivisionsnull父级行政区划的 ISO 3166-2 代码,用于嵌套行政区划。

常见问题

如何获取阿拉伯语国家列表? 使用 data/worldref.ar.json(如果只需要名称,则使用 data/modules/core.ar.json)。每一行都有阿拉伯语的 name。如需现成的选择器排序顺序,请按 sort 排序(排序时会忽略「ال」和各种形式的 hamza)。

在哪里可以找到阿拉伯语的男性和女性国籍名称列表? data/modules/nationality.json:nationality_ar_m(سعودي)和 nationality_ar_f(سعودية),以及 nationality_en(Saudi)。

如何验证沙特阿拉伯手机号码? 使用 parsePhone(input, byIso2("SA")),并检查 valid && mobile。规则位于 phone[0].mobile_pattern:去掉开头的 0 后,为以 50、51、53 至 59 开头的 9 位数字。支持阿拉伯数字。

为什么有些国家的 travel.emergency.police 为 null? 仅发布经官方来源确认的号码。如果某项服务为 null,请拨打 general。

可以将其用于商业用途吗? 可以。代码采用 MIT 许可证;数据许可证(Unicode、Apache-2.0、CC-BY-4.0、CC0、公有领域)均允许商业使用,并在要求时注明出处。请参阅 LICENSE。

数据有多新? 自动任务每月检查上游来源(人口数据每季度检查一次),在来源发生变化且所有测试通过时发布补丁版本。版本信息见 data/meta.json。

面向 AI Agent

请从 llms.txt 和 AGENTS.md 开始。架构定义位于 schema/。MCP 服务(npx -y worldref mcp)提供 get_country、search_countries、validate_phone 和 list_subdivisions。仅依据数据作答,并将 null 视为未知。

路线图

计划在 1.2.0 版本中推出(新增且不破坏兼容性):

  1. 官方阿拉伯语名称:目前有 222 行为空,这是数据中最大的缺口。
  2. 提供两种语言的行政区划类型(地区、省、酋长国、州)。
  3. 更宽容的搜索:支持不带标点或有少量拼写错误的名称(“cote divoire”、“Kuwiat”)。
  4. 地址表单辅助工具:以阿拉伯语或英语提供某个国家地址表单的字段、顺序和标签。
  5. 在 Maven Central 上提供 Kotlin,同时继续支持 JitPack。
  6. 城市:新增 cities 模块,包含阿拉伯语和英语名称,并关联到对应的国家和行政区划。

来源和许可证

代码:MIT。数据:Unicode CLDR 49(Unicode-3.0)、Google libphonenumber v9.0.42 和地址元数据(Apache-2.0,已修改)、World Bank(CC-BY-4.0)、Wikidata(CC0)、CIA World Factbook 最终版和 IANA(公有领域)、flag-icons(MIT),以及用于紧急号码的官方政府来源。完整文本见:LICENSES/。各列来源和每项编辑决策见:data/sources.json。

引用方式:请参阅 CITATION.cff。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。