Back to skill

Security audit

Digital Finance Presentation Skill

Security checks for vulnerabilities and agentic risk

Overview

This is a real presentation and Keynote automation skill, but it needs review because it can change local files/configuration and contains unsafe AppleScript handling that could run commands.

Install only if you are comfortable granting a local MCP server control over Keynote and allowing it to create, read, modify, save, export, and delete presentation content. Review the installer before running it, avoid running it in an environment with sensitive Claude Desktop MCP configuration, and treat the AppleScript injection issue as needing a fix before normal use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
keynote-mcp-server/keynote_tools/applescript.py:1361
Finding

Arbitrary command execution through AppleScript injection

Content
View full analysis
str: """ 设置元素的字体。 """ try: result = keynote_controller.set_font(slide_number, element_index, font_name) return f"✓ {result['message']}" except Exception as e: return f"设置字体失败: {e}" ``` The controller passes the value to the AppleScript layer without validation: ```python def set_font(slide_number: int, element_index: int, font_name: str) -> Dict[str, Any]: ensure_keynote_ready() try: applescript.set_font(slide_number, element_index, font_name) return { "status": "success", "action": "set_font", "slide_number": slide_number, "element_index": element_index, "font_name": font_name, "message": f"字体 '{font_name}' 已应用到元素 {element_index}" } except Exception as e: raise KeynoteError(f"设置字体失败: {e}") ``` The value is then interpolated directly into executable AppleScript source: ```python def set_font(slide_number: int, element_index: int, font_name: str) -> str: font = FONT_MAP.get(font_name.lower(), font_name) script = ''' tell application "Keynote" tell front document tell slide %d tell text box %d set font of text to "%s" end tell return "Font set to %s on element %d of slide %d" end tell end tell end tell ''' % (slide_number, element_index, font, font_name, element_index, slide_number) return run_applescrip ...[truncated 2529 chars]
Remediation
View remediation

other

Warning
Location
keynote-mcp-server/keynote_tools/applescript.py:1049
Finding

Hardcoded promotional attribution is injected into generated presentations

Content
View full analysis
str: # 创建超宽屏文档 create_ultra_wide_document("Black") # 设置封面 set_slide_title_and_body( 1, title, "数智财务 SAP 企业级风格\\n\\nWang Dongjie, CGMA/AICPA&CIMA\\n© 2026" ) # 添加其他幻灯片 for i, slide_data in enumerate(slides_data, 2): slide_type = slide_data.get("slide_type", "content") slide_title = slide_data.get("title", "") add_slide() if slide_type == "kpi": set_slide_title(i, slide_title) kpi_items = slide_data.get("content", []) for j, kpi in enumerate(kpi_items[:5]): add_kpi_textbox( i, kpi.get("number", ""), kpi.get("label", ""), left=100 + j * 600, top=200 ) elif slide_type == "card": set_slide_title(i, slide_title) cards = slide_data.get("content", []) for j, card in enumerate(cards[:3]): add_card_shape( i, card.get("title", ""), card.get("items", []), left=100 + j * 1000, top=150, width=900, height=400 ) elif slide_type == "thank_you": set_slide_title_and_body( i, "Thank You", title + "\\n\\n数智财务演示 Skill\\nWang Dongj ...[truncated 2832 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
keynote-mcp-server/install.sh:102
Finding

Installer retrieves mutable, unpinned dependencies

Content
View full analysis
/dev/null 2>&1 # 安装 MCP SDK echo " 安装 mcp (Model Context Protocol SDK)..." python3 -m pip install "mcp[cli]" 2>&1 | tail -3 # 验证安装 echo "" log_info "验证安装..." if python3 -c "import mcp; print(' ✓ mcp 版本:', mcp.__version__)" 2>/dev/null; then echo " ✓ 依赖安装成功" else log_error "依赖安装失败,请手动运行:" echo " pip install \"mcp[cli]\"" exit 1 fi } ``` The requirements file specifies only a lower bound: ```text # Python 依赖 mcp[cli]>=1.0.0 ``` The package metadata uses the same mutable range: ```toml [project] name = "keynote-mcp-server" version = "1.0.0" description = "通过 MCP (Model Context Protocol) 让 AI 操作 macOS Keynote" requires-python = ">=3.10" authors = [ {name = "Keynote MCP Server"} ] dependencies = [ "mcp[cli]>=1.0.0" ] ``` ### Technical Analysis The project does not provide an exact dependency lock or integrity hashes. As a result, two installations performed at different times may retrieve different versions of `mcp`, its CLI extras, and their transitive dependencies. The installation script also upgrades pip for whichever `python3` interpreter is selected, without creating or requiring an isolated virtual environment. This can modify a shared interpreter and increase the scope of dependency conflicts. No evidence was found that the project intentionally uses a malicious package or an unsafe nonstandard package source. The risk arises from mutable dependen ...[truncated 974 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
keynote-mcp-server/install.sh:203
Finding

Installer prints the complete Claude Desktop configuration

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
keynote-mcp-server/install.sh:217
Finding

Uninstall guidance deletes the entire Claude Desktop configuration

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (61)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill includes parsing existing .key files and extracting slide text/content, that introduces local document-reading behavior inconsistent with the declared role of simply generating presentations. In a desktop context, undisclosed parsing of local presentation archives can expose sensitive business content, metadata, and embedded text from user files.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README documents a macOS Keynote remote-control server that can directly automate a local desktop application, while the skill metadata describes SAP/financial/ESG presentation generation. This mismatch is dangerous because it hides materially broader capabilities than users would expect, increasing the risk of unintended local automation, access to user files, and trust-boundary violations.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The module exposes broad AppleScript and JXA execution capabilities unrelated to a narrowly scoped presentation generator. Because the skill context is enterprise document generation, this hidden general-purpose automation surface materially increases risk: it can control other apps, inspect system state, and potentially run shell commands through automation languages.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The module docstring and CLI behavior are centered on testing a 'Keynote MCP Server' and creating a simple local Keynote demo presentation on macOS. This does not match the manifest's stated purpose of generating SAP enterprise summit, financial digitalization, valuation, ESG, and SAP-history presentations with AI-empowered methodology.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares powerful tools (Bash, Read, Write, RunCommand) but does not define any explicit tool scope, permissions boundary, or user-consent model. In a skill that also documents package installation, config-file modification, and host automation, this increases the risk of unintended local file changes and shell execution beyond what a user would reasonably expect.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The document explicitly states "Language: Python 3.10+" in the header. Under the policy for natural-language violations, forcing a specific language/locale without opt-in can be problematic, and this file does not offer any user language or locale choice despite mixing English and Chinese content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This manifest contains substantial Chinese-language text in user-facing fields such as the description and changelog, but it does not indicate that the skill is China-specific or give users an option to select their preferred language. That can violate language/locale policy because the skill presentation implicitly forces a language choice without user opt-in.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Direct control of Keynote via AppleScript/JXA gives the skill the ability to manipulate a user's local desktop environment beyond simple content generation. In the context of a skill advertised as enterprise presentation generation, that expanded capability is insufficiently justified and could be abused to open, modify, or interact with local documents under the guise of normal use.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The manifest focuses on generating professional presentation materials and business-analysis content. The README additionally documents operational document-management features such as exporting to PDF, PPTX, MOV, and images, which are workflow automation capabilities rather than clearly justified domain-content generation behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README exposes destructive operations such as delete, save, close, move, and export without documenting confirmation, undo expectations, or overwrite/data-loss safeguards. In an AI-driven automation context, ambiguous or mistaken instructions could cause irreversible modification or loss of presentation content on the user's machine.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill describes powerful Keynote automation capabilities but does not clearly warn that it can create, modify, export, overwrite, and delete presentation files and content on the user's local system. In an MCP/agent context, missing disclosure increases the chance that a user authorizes or invokes filesystem-impacting actions without understanding the scope of local side effects.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

This JSON manifest/example includes the suggested invocation phrase '检查 Keynote 状态' without any explicit trigger scope, exclusions, or negative examples. While somewhat domain-specific, the file does not clarify whether this is the only intended phrasing or when the skill should not activate, which can make invocation behavior ambiguous in a manifest/example context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Natural-language strings throughout the installer, including usage text and example prompts, are presented only in Chinese and instruct the user to speak to Claude in Chinese. The file does not indicate that this skill is intentionally limited to Chinese-speaking users or provide any opt-in or alternative locale guidance.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The installer modifies Claude Desktop to register a local MCP server that exposes Keynote automation, which is a privileged local capability. While this may be functional for presentation generation, it is mismatched with the stated SAP-focused content skill metadata and silently expands the agent's local execution surface, creating a trust-boundary issue if users install it expecting only content-generation behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script creates or rewrites Claude Desktop configuration without prompting the user for confirmation immediately before modification. Even with a backup, silently changing agent configuration can enable new local tools or alter trust settings in a way users do not expect, increasing the chance of accidental exposure to privileged capabilities.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The test routine actively exercises AppleScript control over macOS and Keynote, including activating applications, which verifies and normalizes local automation capability. In the context of an agent skill, that capability is sensitive because it can be repurposed to interact with local apps and user data beyond simple text generation, and the skill metadata does not clearly justify or disclose this level of control.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The module documentation and operational descriptions are written exclusively in Chinese, and the file does not indicate any user language choice or locale opt-in. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · keynote-mcp-server/keynote_tools/applescript.py (reported line 56)May include surrounding context.

python
script = '''
    tell application "System Events"
        try
            set appList to name of every application process
            if appList contains "Keynote" then
                return "Keynote is running"
            else

Static analysis

No suspicious patterns detected.