Skip to main content
Glama

askew-mcp

Let any AI agent use your iPhone, iPad or Mac. askew-mcp is the local connector for Askew: an MCP server (stdio) that lets Claude Code, Claude Desktop, Cursor, Codex or any MCP client run Shortcuts on your Apple devices, send you notifications, and read what your phone sends back. The iPhone can stay locked. Recipes sync across devices via iCloud; iPad and Mac support is in testing. Inputs, results and inbox items are sealed on this computer with your key, so the relay never sees plaintext.

iPhone (iOS 27) verified · iPad (iPadOS 27) and Mac in testing · no Android · the Askew app is currently in waitlist at https://askew.my

1. Get a connector key

In the Askew app on your iPhone: Settings → Register device → allow notifications → New connector. Copy the key (akc_…). It is shown once.

Related MCP server: HealthKit MCP

2. Add the connector to your agent

Claude Code

claude mcp add askew -s user -e ASKEW_CONNECTOR_KEY=akc_XXXX -- npx -y askew-mcp

Claude Desktop / Cursor / any MCP client (claude_desktop_config.json, .cursor/mcp.json, …)

{
  "mcpServers": {
    "askew": {
      "command": "npx",
      "args": ["-y", "askew-mcp"],
      "env": { "ASKEW_CONNECTOR_KEY": "akc_XXXX" }
    }
  }
}

Codex CLI (~/.codex/config.toml)

[mcp_servers.askew]
command = "npx"
args = ["-y", "askew-mcp"]
env = { ASKEW_CONNECTOR_KEY = "akc_XXXX" }

The first run creates ~/.askew/connector.key (X25519 private key, mode 0600), registers the public key with the relay and prints a fingerprint on stderr. Compare it with the fingerprint shown in the app's connector screen once; that check rules out a swapped relay.

npx -y askew-mcp fingerprint   # print this computer's connector fingerprint

3. Install the dispatcher on the phone

In the app's Presets tab, install the Askew dispatcher (share sheet → Shortcuts → Add), open it and turn on the Automation toggle at the top. With the phone unlocked, run one test push from Settings → Checkup and tap Always Allow. One toggle, one allow, once. Then add recipes (Calendar, Reminders, Notes, …) the same way and ask your agent:

"Add dentist Thursday 3pm to my phone calendar."

Tools

Tool

What it does

askew_run

Run a route (Shortcut) on the phone and get the result. Works locked. Waits up to wait seconds; on unknown, poll with askew_get_run

askew_get_run

Status and result of a job

askew_list_routes

Routes, devices, connection mode

askew_notify

Notification to the phone + results box (agent → person, one-way)

askew_inbox_list / askew_inbox_wait / askew_inbox_ack

Read what the phone sent (waits up to 30 s), then acknowledge

askew_variables_get / askew_variables_set

Variables shared with the phone, sealed with the account key

Inbox items always come back marked as data sent by the user's phone, not instructions.

Environment

Variable

Default

ASKEW_CONNECTOR_KEY

required, akc_… from the app

ASKEW_SERVER

https://api.askew.my

relay URL (http://localhost:8787 for local development)

ASKEW_KEY_PATH

~/.askew/connector.key

where the private key lives

Requires Node 22 or newer.

Privacy

Job inputs, results, notifications' bodies, inbox items and variables are encrypted end-to-end (HPKE, X25519) between this connector and the phone. The relay stores only metadata: route name, timestamps, status. Details: https://askew.my/#privacy

Development

Source: https://github.com/Dominic-DK/askew-mcp (issues and pull requests welcome). The connector is the only part of Askew that holds your key, so it is the part you can read.

git clone https://github.com/Dominic-DK/askew-mcp.git && cd askew-mcp
pnpm install
pnpm build          # tsc → dist/
pnpm test           # crypto + key-file unit tests, no relay needed
ASKEW_SERVER=http://localhost:8787 ASKEW_CONNECTOR_KEY=akc_XXXX pnpm dev   # run from source

src/crypto.ts is the whole envelope format: HPKE (X25519 + HKDF-SHA256 + ChaCha20-Poly1305) with the purpose bound as info, and a ChaCha20-Poly1305 box keyed by the account key for shared variables, with the variable name as AAD.


한국어

에이전트(Claude Code · Claude 데스크톱 · Cursor · Codex)가 아이폰을 도구로 쓰게 하는 로컬 커넥터입니다. 아이폰 앱 → 설정 → 새 커넥터 만들기 → 키(akc_…)를 복사한 뒤 위 명령 중 하나로 등록하세요. 첫 실행에 찍히는 지문을 앱 커넥터 화면의 지문과 한 번 맞춰 보세요. 그다음 앱 프리셋 탭에서 디스패처를 설치(공유 시트 → 단축어 → 추가 → 자동화 토글 켜기 → 잠금 해제 상태 테스트 푸시 1회 "항상 허용")하면 잠긴 폰에서도 단축어가 돕니다. iPhone(iOS 27) 확인됨, iPad·Mac은 테스트 중. Android 없음.

Available Tools

9 tools
askew_get_runA

Get the status and result of a job started with askew_run (use when the run returned 'unknown').

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo
jobIdYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden for behavioral disclosure. It implies a read operation but does not mention the optional 'wait' parameter (which can block up to 60 seconds) or any side effects, errors, or return behavior. It adds some context (the 'unknown' trigger) but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence. It front-loads the primary purpose and places the usage condition in parentheses, avoiding unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description must compensate for missing details. It omits explanation of the wait parameter, the nature of the returned status/result, and potential errors or timeouts. This leaves agents guessing about blocking behavior and response format, making it incomplete for a tool that can wait.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It only implies jobId by referencing 'a job started with askew_run', but never explicitly describes it or the 'wait' parameter. The description fails to add meaning for the wait parameter, which is essential for correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get') and resource ('status and result of a job'), and names the related tool askew_run, which differentiates it from siblings like askew_run, askew_list_routes, etc. The parenthetical adds a clear distinguishing condition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly provides a usage trigger: 'use when the run returned unknown'. This names the alternative (askew_run) and the condition that selects this tool, giving clear guidance on when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_inbox_ackA

Mark handled inbox items as acknowledged so they no longer appear.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It does state the key behavioral outcome — acknowledged items no longer appear — which is useful. However, it does not disclose whether acknowledgment is reversible, what permissions are required, or what happens to the underlying items beyond visibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short, purposeful sentence with no filler. It front-loads the action and immediately states the practical result, making it easy to scan and understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the core purpose and effect. Still, it leaves gaps: where the ids are obtained, whether acknowledgment is permanent, and what prerequisite 'handled' actually means. An agent could invoke it, but with only partial confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'ids' parameter beyond hinting that items are involved. The schema says ids is a non-empty string array, but the description does not clarify that these are inbox item IDs or where they come from. The low schema coverage requires more compensation than this provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Mark'), a clear resource ('handled inbox items'), and the expected consequence ('so they no longer appear'). This distinguishes it from sibling tools like askew_inbox_list and askew_inbox_wait, making the action unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'handled inbox items' gives clear context about when this tool is appropriate: after items have been processed and need acknowledgment. It does not explicitly name alternatives or exclusion conditions, but the intended usage is reasonably inferable from the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_inbox_listA

Fetch items the phone sent to the agent (trigger data, share sheet, payments…). Call askew_inbox_ack after handling them.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoISO 시각 — 이 이후 항목만

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It usefully indicates that items are sent by the phone and that acknowledgement is expected afterward, implying items are not auto-acked. However, it does not disclose ordering, pagination, whether the list is destructive, or how unacknowledged items behave over time.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no waste. The main action is front-loaded, concrete examples are placed parenthetically, and the follow-up action (ack) is included without bloating the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter, no-output-schema tool, the description provides enough context to know what the tool does and what to do next. It does not enumerate the output item shape, but the examples give a sufficient high-level understanding for an agent to invoke it effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the only parameter, 'since', is documented as an ISO time filter for items after that time. The description adds no parameter-level detail, but none is needed because the schema already explains the parameter sufficiently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetch') and resource ('items the phone sent to the agent'), with concrete examples such as trigger data, share sheet, and payments. This clearly distinguishes it from sibling askew_inbox_ack and most other sibling tools. The only minor gap is not explicitly contrasting with askew_inbox_wait, but the name and description make the list-versus-wait distinction clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to call askew_inbox_ack after handling items, establishing a clear workflow sequence. It does not explicitly state when to prefer this tool over askew_inbox_wait or other siblings, but the fetch semantics are implied strongly enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_inbox_waitB

Wait up to 30 seconds for a new inbox item (loop this to react immediately).

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNo
timeoutNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the wait duration and the looping behavior, but does not disclose what happens on timeout (e.g., returns empty, returns null, errors), whether it consumes the item, or whether it is a read-only operation. The timeout behavior is partially implied by the schema default/maximum, but the return-on-timeout behavior is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence with a parenthetical usage hint. Every word earns its place, and the key behavior (wait up to 30 seconds) is front-loaded. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a polling tool with no annotations and no output schema, the description is thin. It does not explain the 'since' parameter, what a 'new inbox item' means, what the return value looks like, or timeout behavior. The loop hint helps, but an agent still lacks enough to call it correctly with confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it does not explain either parameter. 'since' is entirely unexplained (likely a timestamp/cursor), and 'timeout' is only implied by the description's 'up to 30 seconds'. The schema provides types/defaults but no semantic meaning, so an agent cannot confidently construct a correct call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('wait') and resource ('new inbox item'), and adds a concrete time bound ('up to 30 seconds'). It is clear enough to distinguish from siblings like askew_inbox_list (list) and askew_inbox_ack (acknowledge), though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'loop this to react immediately' gives explicit usage context for a polling/waiting pattern. It implies this tool is for blocking until a new item arrives, versus listing or acknowledging. It does not explicitly state when not to use it or name alternatives, but the loop guidance is useful and clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_list_routesA

List the routes (runnable Shortcuts), devices and connection mode registered to this account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the transparency burden. 'List' communicates a read-only, non-destructive operation, and 'registered to this account' clarifies scope. It does not disclose whether the data is live or cached, or whether an active connection is required, but for a simple listing tool this is a reasonable baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the action verb and clearly enumerates the returned items. The parenthetical clarification '(runnable Shortcuts)' adds value without unnecessary length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool, the description covers the essential information: what is listed and the account scope. There is no output schema, but the description implies the return content. It could mention the purpose of the list (e.g., preparing for a run), but that is not strictly necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% coverage, so there are no parameter semantics to clarify. The baseline for no parameters is 4, and the description adds relevant context about what is being listed without needing to describe parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resources: routes (runnable Shortcuts), devices, and connection mode registered to the account. It is specific and understandable, though it does not explicitly differentiate itself from sibling tools by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this when you need to discover routes, devices, or connection state. However, there is no explicit guidance on when to prefer this tool over siblings or any mention of prerequisites like authentication or connection status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_notifyA

Send a notification to the user's phone and keep it in the results box (agent → person, one-way; not a conversation).

ParametersJSON Schema
NameRequiredDescriptionDefault
refNo
bodyNo
titleYes
contentNo
deviceIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals meaningful traits: delivery goes to the phone, the message is kept in the results box, and it is strictly one-way rather than conversational. It does not cover failure behavior or delivery guarantees, but the disclosed intent is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one clear, front-loaded sentence with a parenthetical behavioral qualifier. Every part earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no output schema, and no annotations, the description is too thin. It explains the high-level effect but not how to populate the parameters, what the tool returns, or what happens on failure, leaving an agent to guess about critical invocation details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no parameter-specific guidance. Property names like title, body, content, ref, and deviceId are somewhat self-explanatory from the notification context, but ambiguous duplication between body and content and the purpose of ref and deviceId remain unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: it sends a notification to the user's phone and persists it in the results box. The parenthetical emphasizes agent-to-person, one-way communication and explicitly distinguishes it from a conversation, which separates it from the inbox sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate: one-way notification delivery from agent to person rather than a conversation. It does not explicitly name an alternative tool like askew_inbox_* for two-way exchanges, but the exclusion is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_runA

Run a Shortcut (route) on the user's iPhone and get the result back. Works while the phone is locked. Input and result are end-to-end encrypted. Call askew_list_routes first: each route lists an inputExample and the input MUST use exactly those keys (dates 'YYYY-MM-DD HH:mm'); a mismatched input is rejected before anything runs. Waits up to wait seconds; if status is 'unknown', poll with askew_get_run.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo결과를 기다릴 초(0이면 즉시 반환)
inputYesInput for the Shortcut. MUST follow the route's inputExample from askew_list_routes (same JSON keys; dates as 'YYYY-MM-DD HH:mm'). A JSON object for routes whose example is an object; a plain string only for routes whose example is a string.
routeIdNo
routeNameNo
idempotencyKeyNo같은 요청을 다시 보낼 때 같은 키를 쓰면 중복 실행되지 않음

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and it discloses important behavior: locked-phone operation, end-to-end encryption, validation before execution, a blocking wait, and an 'unknown' status requiring polling. It does not spell out that Shortcuts can have side effects or detail permission requirements, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with the core operation first, followed by the most important constraints and polling behavior. No filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-output-schema, async execution tool, it covers prerequisites, input validation, wait semantics, and polling. It is slightly incomplete on selecting the route via routeId vs routeName and on expected success/error result shapes, but it is closer to complete than most definitions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description strongly clarifies `input` (exact keys, date format, mismatched-input rejection) and partly explains `wait` via the timeout sentence. However, routeId and routeName are not explained, and the description never mentions idempotencyKey beyond what the schema already says, leaving 60%-coverage gaps partially unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence uses a specific verb-resource pair ('Run a Shortcut (route) on the user's iPhone') and clearly differentiates the tool from sibling list/get tools by saying the run returns the result, while listing routes first and polling with askew_get_run.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit precondition ('Call askew_list_routes first'), a hard constraint on input keys and date format, and a concrete error-handling path ('if status is "unknown", poll with askew_get_run'). This tells the agent exactly when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_variables_getB

Read a variable shared with the phone (sealed with the account key the phone issued; the relay cannot read it).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It adds a meaningful security property: the variable is sealed with the phone-issued key and the relay cannot read it. However, it omits return format, error behavior, and permission details, so transparency is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. The security parenthetical is the only extra clause and it earns its place by communicating an important constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read operation, the description provides the essential purpose and an important security caveat. However, since there is no output schema, it does not state what the tool returns or how it behaves on missing variables, leaving an agent with enough to invoke but not fully anticipate the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only exposes a `name` string with minLength 1, and the description adds context by clarifying that the name refers to a variable shared with the phone. Coverage is 0%, but the single self-evident parameter limits the need for deeper explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a verb and resource: 'Read a variable,' and the shared-with-phone qualifier adds specificity. It does not explicitly name a sibling such as askew_variables_set, but the read/write contrast is readily inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives like askew_variables_set. There are no conditions, exclusions, or references to sibling tools, so the correct usage context must be inferred from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

askew_variables_setC

Write a variable shared with the phone (sealed with the account key; the phone reads it with the same key).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
valueYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does provide some useful context about encryption ('sealed with the account key') and that the phone reads it with the same key, which is helpful. However, it omits critical behavior such as whether the operation overwrites existing variables, what happens on failure, any size limits, or the response format. This is a meaningful gap for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core action ('Write a variable shared with the phone') and adds a brief technical note about sealing. Every word earns its place with no filler. It is appropriately sized for such a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, no output schema), the description is generally adequate for a basic understanding but lacks essential context. It does not explain whether the write is an upsert, how errors are reported, or what the tool returns (if anything). An agent cannot infer important operational details that are not in the schema or annotations, making the tool harder to use correctly without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It does not explain the semantics of 'name' or 'value' beyond the schema's types. The phrasing 'Write a variable' implies name is the variable identifier and value is the content, but it does not clarify aspects like allowed value shapes, constraints, or how the name must be formatted. The description adds little value over the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Write' and the resource 'variable shared with the phone', which distinguishes it from the read counterpart (askew_variables_get). It conveys the essential purpose without being a tautology. However, it does not explicitly name any sibling tool for differentiation, relying on inference from the phrase 'shared with the phone'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. The phrasing 'shared with the phone' implies a use case, but it does not specify when to choose this over other tools like askew_variables_get or askew_run. The agent must infer usage from context alone, which is insufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.2
    • First observedaskew_get_run
    • First observedaskew_inbox_ack
    • First observedaskew_inbox_list
    • First observedaskew_inbox_wait
    • First observedaskew_list_routes
    • First observedaskew_notify
    • First observedaskew_run
    • First observedaskew_variables_get
    • First observedaskew_variables_set

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct concern: notification, inbox lifecycle (list/wait/ack), shared variables (get/set), and shortcut execution (run/get_run/list_routes). Overlapping tools like inbox_list and inbox_wait have clearly differentiated roles (fetch existing vs. block for new).

Naming Consistency4/5

All tools share the askew_ prefix and use snake_case, which is consistent. Some ordering variation exists (inbox_list is noun-verb while list_routes is verb-noun, and notify/run are verb-only), but the pattern remains readable and predictable.

Tool Count5/5

Nine tools is well-scoped for a mobile-bridge server. Each tool covers a necessary action (notify, handle inbox, share variables, execute shortcuts) without redundant or filler tools.

Completeness5/5

The tool surface covers the full lifecycle for each capability: inbox items can be fetched, waited on, and acknowledged; variables can be read and written; shortcut runs can be started, polled, and discovered via route listing. No critical dead ends are evident.

Related MCP Connectors

Related MCP Servers