Nymrel
Four public utilities plus seven OAuth-protected Remote read tools for paired Nymrel devices.
我該用這個嗎
品質與安全性
發現項目(1)
- LOW在 nymrel_remote_list_devices 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"nymrel": {
"url": "https://mcp.nymrel.com/mcp"
}
}
}遠端端點
https://mcp.nymrel.com/mcpstreamable-http它能做什麼
工具清單
工具(11)
🟢nymrel_audit_website(url)
Audit one public website for SEO, schema, and AI discoverability. Returns the score, grade, discoverability status, detected schema types and recommendations supplied by the audit. Results may contain only an aggregate summary; additional per-check evidence may be included. Report robots.txt, sitemap.xml, llms.txt or AI-crawler checks only when their evidence is present in the result; absent checks are unreported, not proven by an aggregate score or PASS. Preserve unmeasured checks and empty recommendations without inventing findings. This is not a ranking guarantee or a security, legal-compliance or crawler-access certification.
輸入結構描述
{
"type": "object",
"properties": {
"url": {
"type": "string"
}
},
"required": [
"url"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"anyOf": [
{
"additionalProperties": true,
"properties": {
"score": {
"maximum": 100,
"minimum": 0,
"title": "Score",
"type": "number"
},
"grade": {
"title": "Grade",
"type": "string"
},
"ai_discoverability_status": {
"title": "Ai Discoverability Status",
"type": "string"
},
"schema_detected": {
"items": {
"type": "string"
},
"title": "Schema Detected",
"type": "array"
},
"recommendations": {
"items": {
"type": "string"
},
"title": "Recommendations",
"type": "array"
},
"full_report_url": {
"title": "Full Report Url",
"type": "string"
}
},
"required": [
"score",
"grade",
"ai_discoverability_status",
"schema_detected",
"recommendations",
"full_report_url"
],
"title": "AuditSummary",
"type": "object"
},
{
"additionalProperties": true,
"properties": {
"status": {
"const": "error",
"title": "Status",
"type": "string"
},
"error": {
"additionalProperties": true,
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"message": {
"title": "Message",
"type": "string"
},
"retryable": {
"title": "Retryable",
"type": "boolean"
}
},
"required": [
"code",
"message",
"retryable"
],
"title": "ErrorDetail",
"type": "object"
}
},
"required": [
"status",
"error"
],
"title": "ErrorResult",
"type": "object"
}
]
}🟢nymrel_golf_bag_gap(clubs)
Analyse carry-distance gaps for a structured list of golf clubs. Every club needs a ``name`` and its measured ``carry_distance_yards``; ``loft_degrees`` is optional. Pass 1 to 14 clubs with unique names. The upstream rejects any other key, so send only these three.
輸入結構描述
{
"type": "object",
"properties": {
"clubs": {
"items": {
"additionalProperties": false,
"description": "One club. ``loft_degrees`` is the only optional key the upstream allows.\n\nA pydantic model, not a TypedDict, and not for style: the hosted runtime's\nschema generator degraded ``typing.TypedDict`` to a bare object (proven\nlive 2026-08-17 - the docstring survived, the properties vanished), while\n``BaseModel`` publishes named properties on every pydantic v2 / Python\npairing. ``extra=\"forbid\"`` mirrors the upstream's strict validator, so\nthe published schema and the enforcement are the same contract.",
"properties": {
"name": {
"type": "string"
},
"carry_distance_yards": {
"type": "integer"
},
"loft_degrees": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"name",
"carry_distance_yards"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"clubs"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"anyOf": [
{
"additionalProperties": true,
"properties": {
"average_gap_yards": {
"minimum": 0,
"title": "Average Gap Yards",
"type": "number"
},
"problem_gaps": {
"items": {
"type": "string"
},
"title": "Problem Gaps",
"type": "array"
},
"recommendations": {
"items": {
"type": "string"
},
"title": "Recommendations",
"type": "array"
}
},
"required": [
"average_gap_yards",
"problem_gaps",
"recommendations"
],
"title": "GolfResult",
"type": "object"
},
{
"additionalProperties": true,
"properties": {
"status": {
"const": "error",
"title": "Status",
"type": "string"
},
"error": {
"additionalProperties": true,
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"message": {
"title": "Message",
"type": "string"
},
"retryable": {
"title": "Retryable",
"type": "boolean"
}
},
"required": [
"code",
"message",
"retryable"
],
"title": "ErrorDetail",
"type": "object"
}
},
"required": [
"status",
"error"
],
"title": "ErrorResult",
"type": "object"
}
]
}🟢nymrel_find_domain(keyword_or_concept, tlds)
Suggest domain names and check each one against public registry records. A name is only reported available when the registry clearly says it is free. When the lookup is inconclusive `availability_checked` is false and `available` is false, so read that as "not confirmed free" rather than "already taken" - some TLDs have no registry service to ask. Confirm at a registrar before buying. `brandability_score` is an opinion about the string, not a claim about how the name will perform; `brandability_factors` reports what it was computed from so you can weigh it yourself.
輸入結構描述
{
"type": "object",
"properties": {
"keyword_or_concept": {
"type": "string"
},
"tlds": {
"anyOf": [
{
"items": {
"examples": [
".com",
".ai",
".app",
".dev"
],
"pattern": "^\\.[a-z]{2,24}$",
"type": "string"
},
"maxItems": 6,
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Up to 6 TLDs, each written with its leading dot - \".com\", not \"com\". The upstream enforces this with a regex and rejects the request otherwise. Defaults to .com, .ai, .app and .dev."
}
},
"required": [
"keyword_or_concept"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"anyOf": [
{
"additionalProperties": true,
"properties": {
"suggestions": {
"items": {
"additionalProperties": true,
"properties": {
"domain": {
"title": "Domain",
"type": "string"
},
"available": {
"title": "Available",
"type": "boolean"
},
"availability_checked": {
"title": "Availability Checked",
"type": "boolean"
},
"brandability_score": {
"maximum": 100,
"minimum": 0,
"title": "Brandability Score",
"type": "number"
},
"brandability_factors": {
"additionalProperties": true,
"properties": {
"label_length": {
"title": "Label Length",
"type": "integer"
},
"contains_digit": {
"title": "Contains Digit",
"type": "boolean"
},
"contains_hyphen": {
"title": "Contains Hyphen",
"type": "boolean"
},
"contains_vowel": {
"title": "Contains Vowel",
"type": "boolean"
}
},
"required": [
"label_length",
"contains_digit",
"contains_hyphen",
"contains_vowel"
],
"title": "BrandabilityFactors",
"type": "object"
}
},
"required": [
"domain",
"available",
"availability_checked",
"brandability_score",
"brandability_factors"
],
"title": "DomainSuggestion",
"type": "object"
},
"title": "Suggestions",
"type": "array"
}
},
"required": [
"suggestions"
],
"title": "DomainResult",
"type": "object"
},
{
"additionalProperties": true,
"properties": {
"status": {
"const": "error",
"title": "Status",
"type": "string"
},
"error": {
"additionalProperties": true,
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"message": {
"title": "Message",
"type": "string"
},
"retryable": {
"title": "Retryable",
"type": "boolean"
}
},
"required": [
"code",
"message",
"retryable"
],
"title": "ErrorDetail",
"type": "object"
}
},
"required": [
"status",
"error"
],
"title": "ErrorResult",
"type": "object"
}
]
}🟢nymrel_social_clip_score(transcript_text, target_platform)
Measure what the opening of a short-video transcript actually does. Returns each measured signal - opening word count, whether it opens on a hook pattern, whether it addresses the viewer, curiosity signals, whether the total word count sits in the platform's range - plus `hook_score`, a 0-100 rollup of exactly those signals, and suggested edits. `target_platform` accepts `tiktok`, `instagram_reels`, `youtube_shorts`, or `x`. The `reels` and `shorts` aliases normalize to their corresponding canonical IDs, which the result echoes. Every figure describes the text the caller supplied. This does not estimate reach, views, retention or virality; those are outcomes in the world that this tool never observes. Read `signals` to see what moved the score.
輸入結構描述
{
"type": "object",
"properties": {
"transcript_text": {
"type": "string"
},
"target_platform": {
"default": "tiktok",
"enum": [
"tiktok",
"reels",
"shorts",
"instagram_reels",
"youtube_shorts",
"x"
],
"type": "string"
}
},
"required": [
"transcript_text"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"anyOf": [
{
"additionalProperties": true,
"properties": {
"target_platform": {
"enum": [
"tiktok",
"instagram_reels",
"youtube_shorts",
"x"
],
"title": "Target Platform",
"type": "string"
},
"hook_score": {
"maximum": 100,
"minimum": 0,
"title": "Hook Score",
"type": "number"
},
"hook_strength": {
"title": "Hook Strength",
"type": "string"
},
"signals": {
"additionalProperties": true,
"properties": {
"opening_word_count": {
"minimum": 0,
"title": "Opening Word Count",
"type": "integer"
},
"opens_with_hook_pattern": {
"title": "Opens With Hook Pattern",
"type": "boolean"
},
"addresses_viewer": {
"title": "Addresses Viewer",
"type": "boolean"
},
"has_curiosity_signal": {
"title": "Has Curiosity Signal",
"type": "boolean"
},
"opening_contains_number": {
"title": "Opening Contains Number",
"type": "boolean"
},
"total_word_count": {
"minimum": 0,
"title": "Total Word Count",
"type": "integer"
},
"platform_word_range": {
"items": {
"type": "integer"
},
"maxItems": 2,
"minItems": 2,
"title": "Platform Word Range",
"type": "array"
},
"total_word_count_in_platform_range": {
"title": "Total Word Count In Platform Range",
"type": "boolean"
}
},
"required": [
"opening_word_count",
"opens_with_hook_pattern",
"addresses_viewer",
"has_curiosity_signal",
"opening_contains_number",
"total_word_count",
"platform_word_range",
"total_word_count_in_platform_range"
],
"title": "ClipSignals",
"type": "object"
},
"suggested_edits": {
"items": {
"type": "string"
},
"title": "Suggested Edits",
"type": "array"
}
},
"required": [
"target_platform",
"hook_score",
"hook_strength",
"signals",
"suggested_edits"
],
"title": "ClipResult",
"type": "object"
},
{
"additionalProperties": true,
"properties": {
"status": {
"const": "error",
"title": "Status",
"type": "string"
},
"error": {
"additionalProperties": true,
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"message": {
"title": "Message",
"type": "string"
},
"retryable": {
"title": "Retryable",
"type": "boolean"
}
},
"required": [
"code",
"message",
"retryable"
],
"title": "ErrorDetail",
"type": "object"
}
},
"required": [
"status",
"error"
],
"title": "ErrorResult",
"type": "object"
}
]
}🟢nymrel_remote_list_devices
Use this when the user wants to see paired Nymrel Remote devices and current reachability before working with one.
輸入結構描述
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢nymrel_remote_read_file(device, path, offset, length)
Use this when the user explicitly wants Nymrel Remote to read a UTF-8 text file with optional line pagination. Select the target with the optional device argument.
輸入結構描述
{
"type": "object",
"properties": {
"device": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Paired device id or exact device name. Omit only when exactly one eligible device is available."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Absolute path or path relative to the configured working directory."
},
"offset": {
"type": "integer",
"default": 0,
"description": "0-based start line; negative values read from the tail."
},
"length": {
"type": "integer",
"minimum": 1,
"maximum": 10000,
"default": 1000
}
},
"required": [
"path"
],
"additionalProperties": false
}🟢nymrel_remote_list_directory(device, path, depth)
Use this when the user explicitly wants Nymrel Remote to list a directory tree with a bounded recursion depth. Select the target with the optional device argument.
輸入結構描述
{
"type": "object",
"properties": {
"device": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Paired device id or exact device name. Omit only when exactly one eligible device is available."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Absolute path or path relative to the configured working directory."
},
"depth": {
"type": "integer",
"minimum": 1,
"maximum": 8,
"default": 2
}
},
"required": [
"path"
],
"additionalProperties": false
}🟢nymrel_remote_get_file_info(device, path)
Use this when the user explicitly wants Nymrel Remote to return metadata for a file or directory. Select the target with the optional device argument.
輸入結構描述
{
"type": "object",
"properties": {
"device": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Paired device id or exact device name. Omit only when exactly one eligible device is available."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Absolute path or path relative to the configured working directory."
}
},
"required": [
"path"
],
"additionalProperties": false
}🟢nymrel_remote_search_files(device, path, pattern, ignoreCase, maxResults, ...)
Use this when the user explicitly wants Nymrel Remote to search file and directory names below an allowed path. Select the target with the optional device argument.
輸入結構描述
{
"type": "object",
"properties": {
"device": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Paired device id or exact device name. Omit only when exactly one eligible device is available."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Absolute path or path relative to the configured working directory."
},
"pattern": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"ignoreCase": {
"type": "boolean",
"default": true
},
"maxResults": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 100
},
"maxDepth": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10
}
},
"required": [
"path",
"pattern"
],
"additionalProperties": false
}🟢nymrel_remote_search_content(device, path, pattern, filePattern, literalSearch, ...)
Use this when the user explicitly wants Nymrel Remote to search UTF-8 file contents below an allowed path. Select the target with the optional device argument.
輸入結構描述
{
"type": "object",
"properties": {
"device": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Paired device id or exact device name. Omit only when exactly one eligible device is available."
},
"path": {
"type": "string",
"minLength": 1,
"description": "Absolute path or path relative to the configured working directory."
},
"pattern": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"filePattern": {
"type": "string",
"maxLength": 256
},
"literalSearch": {
"type": "boolean",
"default": true
},
"ignoreCase": {
"type": "boolean",
"default": true
},
"maxResults": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 100
},
"maxDepth": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10
}
},
"required": [
"path",
"pattern"
],
"additionalProperties": false
}🟢nymrel_remote_get_read_result(callId)
Retrieve the result of your pending Nymrel Remote read using its callId. If a file inspection returns pending, use this tool instead of submitting that inspection again. It never starts a new device operation. If still pending, wait briefly before checking again.
輸入結構描述
{
"type": "object",
"properties": {
"callId": {
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"required": [
"callId"
],
"additionalProperties": false
}社群
證據