Skip to main content
Glama
jopmiddelkamp

outlook-mcp-limited

save_attachment

Download a single email attachment by message and attachment ID, saving it to the server's allowed local folder without overwriting existing files and returning the saved path.

Instructions

Download one attachment from a message and save it to the local filesystem. Writes are confined to the server's allowed directory (default ~/Downloads/outlook-mcp/). Existing files are never overwritten — the tool appends ' (2)', ' (3)', … to the filename. Returns the absolute path of the saved file.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
messageIdYesThe Graph message ID that contains the attachment.
attachmentIdYesThe Graph attachment ID (from read_email's 'attachments' list).
targetFilenameNoOptional filename override. If omitted, the original attachment filename is used. Must be a bare filename — no path separators, no parent traversal. The destination directory is fixed by the server's OUTLOOK_MCP_ALLOWED_DIR setting and is not LLM-controllable.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.4.2

TDQS

A4.1/5.0
Behavior4/5

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

With zero annotations, the description carries the full behavior burden and handles it well: it discloses the filesystem write side effect, the confinement to the server's allowed directory, the non-overwrite policy with the ' (2)', ' (3)' renaming scheme, and the return value. What is missing is auth/permission requirements and failure modes (oversized attachments, missing IDs).

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?

Three tight sentences, front-loaded with the action and resource, then side effects, then return value. No filler, and the overwrite-avoidance detail is stated before the return contract where an agent would want it.

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

Completeness5/5

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

For a 3-parameter mutation tool with no output schema and no annotations, the description covers what an agent needs: the write target directory, the collision-handling rule, and the return value (absolute path). The only omission — error behavior — is minor for this operation.

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% — all three parameters, including the targetFilename constraints and the non-LLM-controllable destination directory, are fully documented in the schema. The description adds only marginal framing ("one attachment", "default ~/Downloads/outlook-mcp/"), so the baseline 3 applies.

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?

Specific verb+resource ("Download one attachment from a message and save it to the local filesystem") with clear scope — exactly one attachment per call, written to disk. This is cleanly distinguishable from the read-only siblings (read_email, list_emails, search_emails), which retrieve content but do not persist it.

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?

Usage is implied by the phrasing (extract an attachment to disk), and the schema notes that attachmentId comes from read_email's attachments list, which hints at the workflow. However, the description itself names no alternatives and states no when-not conditions — e.g. whether it works for inline images or whether read_email is sufficient when you don't need the bytes on disk.

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