Grammarly文本优化服务

通过浏览器自动化技术实现Grammarly的AI检测和抄袭评分功能,并提供文本重写优化服务。

  • by BjornMelin
  • TypeScript
  • 本地部署
  • 10 星标
  • 更新于
在 GitHub 查看 BjornMelin/grammarly-mcp

使用说明

语法MCP服务器

通过Grammarly的web界面进行人工智能检测和剽窃评分的单工具模型上下文协议(MCP)服务器。支持两个浏览器自动化提供程序: 舞台布景+浏览器基础 (默认)和 浏览器使用云 (回退)。

它的作用

  • 自动化Grammarly的文档UI,以获得AI检测和抄袭百分比
  • 通过Claude重写文本以降低AI检测分数
  • 显示一个MCP工具: grammarly_optimize_text

注: 此服务器通过浏览器自动化与app.grammarly.com进行交互。它不使用Grammarly API。


目录


快速开始

选项A:舞台手+浏览器(推荐)

先决条件: Node.js 18+,Grammarly Pro账号, 浏览 账户

# 1. Clone and build
git clone https://github.com/BjornMelin/grammarly-mcp.git
cd grammarly-mcp
pnpm install && pnpm build

# 2. Get Browserbase credentials
# - Sign up at https://www.browserbase.com
# - Create a project, note the Project ID
# - Generate an API key

# 3. Set up Claude Code CLI (for text rewriting)
npm install -g @anthropic-ai/claude-code
claude login

# 4. Configure environment
cp .env.example .env
# Edit .env with your Browserbase credentials

# 5. Add to Claude Code
claude mcp add grammarly -- node $(pwd)/dist/server.js

# 6. Test
claude "Use grammarly_optimize_text with mode score_only on: Hello world test"

选项B:浏览器使用云(传统)

先决条件: Node.js 18+,Grammarly Pro账号, 浏览器使用云 账户

# 1. Clone and build
git clone https://github.com/BjornMelin/grammarly-mcp.git
cd grammarly-mcp
pnpm install && pnpm build

# 2. Get Browser Use credentials
# - Sign up at https://cloud.browser-use.com
# - Create API key (bu_...)
# - Create profile and sync Grammarly login (profile_...)

# 3. Set up Claude Code CLI
npm install -g @anthropic-ai/claude-code
claude login

# 4. Configure environment
cp .env.example .env
# Set BROWSER_PROVIDER=browser-use and Browser Use credentials

# 5. Add to Claude Code
claude mcp add grammarly -- node $(pwd)/dist/server.js

特性

  • 双供应商支持:舞台手+浏览器基础(默认)或浏览器使用云(回退)
  • 会话持续:浏览器基础上下文在会话之间保留Grammarly登录
  • 自愈自动化:Stagehand自动适应DOM更改
  • 多LLM支持:浏览器自动化的独立提供商(STAGEHAND_LLM_PROVIDER)以及文本重写(REWRITE_LLM_PROVIDER)
  • 实时调试URL:执行过程中的实时浏览器预览
  • 动作缓存:可选缓存,可实现更快的重复操作
  • 结构化输出:JSON或markdown响应格式
  • 进度通知:MCP 2025-11-25进度跟踪支持

需求

所有配置

  • Node.js 18+

  • Grammarly Pro帐户(用于AI检测和抄袭功能)

  • 用于文本重写的Claude代码CLI:

    npm install -g @anthropic-ai/claude-code
    claude login
    

后台提供者(默认)

  • 浏览 账户
  • BROWSERBASE_API_KEY 和 BROWSERBASE_PROJECT_ID

浏览器使用提供程序(回退)

  • 浏览器使用云 账户
  • BROWSER_USE_API_KEY 和 BROWSER_USE_PROFILE_ID
  • 浏览器配置文件已与Grammarly登录状态同步

安装

git clone https://github.com/BjornMelin/grammarly-mcp.git
cd grammarly-mcp
pnpm install
pnpm build

提供者选择

此服务器支持两个浏览器自动化提供程序:

功能 舞台手(默认) 浏览器使用云
提供商 浏览器基础 浏览器使用云
自动化 观察/行动/提取 自然语言任务
自我修复 是 有限
会话持久性 上下文ID 配置文件同步
调试URL 实时 每个任务
动作缓存 是 否
可靠性 较高 中等

何时使用舞台手

  • 需要可靠性的生产工作负载
  • 需要会话持久性以避免重新登录开销
  • 想要实时调试可见性
  • Grammarly UI更改需要自我修复

何时使用浏览器使用云

  • 现有浏览器使用云设置
  • 更喜欢简单的自然语言任务描述
  • 一次性或测试场景

通过环境变量设置提供程序:

BROWSER_PROVIDER=stagehand  # Default
BROWSER_PROVIDER=browser-use  # Fallback

环境变量

环境隔离

变量 必填 默认 描述
IGNORE_SYSTEM_ENV 没有 false 何时 true,忽略shell环境变量,仅使用 .env 文件。防止IDE继承的环境污染。

提供程序配置

变量 必填 默认 描述
BROWSER_PROVIDER 没有 stagehand stagehand 或 browser-use

舞台布景+浏览器基础

需要时 BROWSER_PROVIDER=stagehand:

变量 必填 描述
BROWSERBASE_API_KEY 是 API密钥来自 基于浏览器的.Com
BROWSERBASE_PROJECT_ID 是 来自Browsebase仪表板的项目ID
BROWSERBASE_CONTEXT_ID 否 Grammarly登录状态的持久上下文
BROWSERBASE_SESSION_ID 否 重用现有会话(高级)
STAGEHAND_MODEL 没有 已弃用。 使用 STAGEHAND_LLM_PROVIDER +改为模型变量
STAGEHAND_CACHE_DIR 否 操作缓存目录
GOOGLE_GENERATIVE_AI_API_KEY 没有* Gemini模型的Google API密钥。也接受 GEMINI_API_KEY

*使用Google/GGemini模型时需要(默认)。从……得到 aistudio.google.com.

浏览器使用云

需要时 BROWSER_PROVIDER=browser-use:

变量 必填 描述
BROWSER_USE_API_KEY 是 API密钥来自 cloud.browser-use.com
BROWSER_USE_PROFILE_ID 是 已同步Grammarly登录的个人资料

LLM提供者控制

独立的LLM提供程序用于浏览器自动化和文本重写(可以使用不同的提供程序):

变量 必填 默认 描述
STAGEHAND_LLM_PROVIDER 否 自动检测 LLM用于浏览器自动化: claude-code, openai, google, anthropic
REWRITE_LLM_PROVIDER 否 自动检测 LLM用于文本重写: claude-code, openai, google, anthropic

如果未设置,则从API密钥自动检测(优先级:OpenAI>Google>Anthropic>Claude Code)。

模型选择

变量 必填 默认 描述
CLAUDE_MODEL 没有 auto 克劳德模型: auto, haiku, sonnet, opus。根据文本长度和迭代次数自动选择。
ANTHROPIC_MODEL 没有 claude-sonnet-4-20250514 使用直接的Anthropic提供者时的Anthrotic模型id。
OPENAI_MODEL 没有 gpt-4o OpenAI模型名称
GOOGLE_MODEL 没有 gemini-2.5-flash 谷歌/双子座型号名称

API密钥

变量 必填 描述
CLAUDE_API_KEY 否 Claude API密钥。如果未设置,则使用 claude login CLI身份验证
OPENAI_API_KEY 无* OpenAI API密钥。使用OpenAI提供程序时需要。
GOOGLE_GENERATIVE_AI_API_KEY 没有* Google API密钥。也接受 GEMINI_API_KEY。谷歌提供商需要。
ANTHROPIC_API_KEY 否* API无烟煤键。使用直接Anthropic提供者时需要。

*显式设置相应的LLM提供程序或自动检测时需要。

超时和日志记录

变量 必填 默认 描述
LOG_LEVEL 没有 info debug, info, warn, error
LLM_REQUEST_TIMEOUT_MS 没有 120000 LLM请求超时(ms)。 CLAUDE_REQUEST_TIMEOUT_MS 仍然接受兼容性。
CONNECT_TIMEOUT_MS 没有 30000 MCP连接超时(ms)

运行服务器

pnpm start
# or
node dist/server.js

服务器使用stdio传输进行MCP通信。


客户端配置

在MCP客户端中配置环境变量。必修的:

自动设置

运行交互式设置脚本,使用您的值自动配置MCP客户端 .env 文件:

# First, configure your .env file with credentials
cp .env.example .env
# Edit .env with your API keys

# Run the setup script
pnpm setup-clients

脚本将:

  • 显示适用于您平台的可用MCP客户端
  • 让您选择要配置的客户端
  • 修改前备份现有配置
  • 编写适当的配置格式(JSON或TOML)

手动配置

Claude Code CLI

通过CLI命令:

claude mcp add grammarly -e BROWSER_PROVIDER=stagehand \
  -e BROWSERBASE_API_KEY=bb_xxx \
  -e BROWSERBASE_PROJECT_ID=xxx \
  -- node /path/to/grammarly-mcp/dist/server.js

或添加到 ~/.claude/settings.json:

{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}
Claude Desktop

添加到您的Claude Desktop配置文件中:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 视窗: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}
Cursor

添加到 ~/.cursor/mcp.json:

{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}

或者通过UI:设置→ MCP → 添加新的MCP服务器

VS Code (GitHub Copilot)

添加到 .vscode/mcp.json 在您的工作空间中:

{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}

或者通过CLI:

code --add-mcp '{"name":"grammarly","command":"node","args":["/path/to/grammarly-mcp/dist/server.js"]}'
Windsurf

添加到 ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}
Gemini CLI

添加到 ~/.gemini/settings.json:

{
  "mcpServers": {
    "grammarly": {
      "command": "node",
      "args": ["/path/to/grammarly-mcp/dist/server.js"],
      "env": {
        "BROWSER_PROVIDER": "stagehand",
        "BROWSERBASE_API_KEY": "bb_xxx",
        "BROWSERBASE_PROJECT_ID": "xxx"
      }
    }
  }
}
OpenAI Codex CLI

添加到 ~/.codex/config.toml:

[mcp_servers.grammarly]
command = "node"
args = ["/path/to/grammarly-mcp/dist/server.js"]

[mcp_servers.grammarly.env]
BROWSER_PROVIDER = "stagehand"
BROWSERBASE_API_KEY = "bb_xxx"
BROWSERBASE_PROJECT_ID = "xxx"
Continue (VS Code Extension)

添加到 .continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "stdio",
          "command": "node",
          "args": ["/path/to/grammarly-mcp/dist/server.js"],
          "env": {
            "BROWSER_PROVIDER": "stagehand",
            "BROWSERBASE_API_KEY": "bb_xxx",
            "BROWSERBASE_PROJECT_ID": "xxx"
          }
        }
      }
    ]
  }
}

推荐配置

Minimal (Claude Pro/Max)

使用您的Claude订阅-无需额外的API密钥:

{
  "env": {
    "BROWSER_PROVIDER": "stagehand",
    "BROWSERBASE_API_KEY": "bb_xxx",
    "BROWSERBASE_PROJECT_ID": "xxx"
  }
}
Cost-Optimized (Always Haiku)

强制使用最便宜的Claude模型:

{
  "env": {
    "BROWSER_PROVIDER": "stagehand",
    "BROWSERBASE_API_KEY": "bb_xxx",
    "BROWSERBASE_PROJECT_ID": "xxx",
    "CLAUDE_MODEL": "haiku"
  }
}
Mixed Providers (Fast + Quality)

Gemini用于浏览器自动化(快速),Claude用于重写(质量):

{
  "env": {
    "BROWSER_PROVIDER": "stagehand",
    "BROWSERBASE_API_KEY": "bb_xxx",
    "BROWSERBASE_PROJECT_ID": "xxx",
    "GOOGLE_GENERATIVE_AI_API_KEY": "xxx",
    "STAGEHAND_LLM_PROVIDER": "google",
    "REWRITE_LLM_PROVIDER": "claude-code",
    "CLAUDE_MODEL": "sonnet"
  }
}
Full Configuration (All Options)
{
  "env": {
    "BROWSER_PROVIDER": "stagehand",
    "BROWSERBASE_API_KEY": "bb_xxx",
    "BROWSERBASE_PROJECT_ID": "xxx",
    "BROWSERBASE_CONTEXT_ID": "ctx_xxx",
    "STAGEHAND_LLM_PROVIDER": "google",
    "GOOGLE_GENERATIVE_AI_API_KEY": "xxx",
    "GOOGLE_MODEL": "gemini-2.5-flash",
    "REWRITE_LLM_PROVIDER": "claude-code",
    "CLAUDE_MODEL": "auto",
    "LOG_LEVEL": "info",
    "LLM_REQUEST_TIMEOUT_MS": "120000",
    "CONNECT_TIMEOUT_MS": "30000"
  }
}

工具:语法优化文本

输入参数

参数 类型 默认值 说明
text 字符串 (必填) 要分析/优化的文本
mode enum optimize score_only, optimize,或 analyze
max_ai_percent 编号 10 目标AI检测阈值(0-100)
max_plagiarism_percent 编号 5 目标抄袭阈值(0-100)
max_iterations 编号 5 最大重写迭代次数(1-20)
tone enum neutral neutral, formal, informal, academic, custom
domain_hint string -- 域上下文(例如,“法律”、“医疗”)
custom_instructions string -- 其他重写指令
proxy_country_code string -- ISO 3166-1地理路由的alpha-2国家代码
response_format enum json json 或 markdown
max_steps 编号 25 最大浏览器自动化步骤(5-100)

输出模式

{
  "final_text": "string",
  "ai_detection_percent": "number | null",
  "plagiarism_percent": "number | null",
  "iterations_used": "number",
  "thresholds_met": "boolean",
  "history": [
    {
      "iteration": "number",
      "ai_detection_percent": "number | null",
      "plagiarism_percent": "number | null",
      "note": "string"
    }
  ],
  "notes": "string",
  "live_url": "string | null",
  "provider": "string"
}

LLM配置

此服务器使用 独立的法学硕士提供者 用于浏览器自动化和文本重写:

目的 环境变量 用例
浏览器自动化 STAGEHAND_LLM_PROVIDER 现场观察/行动/撤离操作
文本重写 REWRITE_LLM_PROVIDER Claude重写文本以减少AI检测

示例:每个任务的不同提供者:

# Fast Google for browser automation, quality Claude for rewriting
STAGEHAND_LLM_PROVIDER=google
GOOGLE_MODEL=gemini-2.5-flash
REWRITE_LLM_PROVIDER=claude-code
CLAUDE_MODEL=sonnet

自动检测优先级 (当提供者未明确设置时):

  1. 开放人工智能 -如果 OPENAI_API_KEY 已设置
  2. 谷歌 -如果 GOOGLE_GENERATIVE_AI_API_KEY 或 GEMINI_API_KEY 已设置
  3. Anthropic -如果 ANTHROPIC_API_KEY 已设置
  4. 克劳德代码CLI (回退)-用途 claude login 认证

克劳德车型自动选择 (当 CLAUDE_MODEL=auto):

文本长度 迭代次数 模型
<3k个字符 ≤3 俳句(最快、最便宜)
3k-12k个字符 4-8 十四行诗(平衡)
>12k个字符 >8 作品(最高质量)

浏览器使用LLM选项

使用浏览器时使用云(BROWSER_PROVIDER=browser-use),自动化使用Browser Use的内置LLM,价格为0.002美元/步。文本重写仍然使用配置的 REWRITE_LLM_PROVIDER.


会话保持

浏览器基础上下文允许您在会话之间持久化Grammarly登录状态。

毅力是如何发挥作用的

  1. 首次运行:服务器创建浏览器基础会话。使用调试URL手动登录Grammarly。
  2. 注释上下文ID:上下文ID出现在服务器日志或会话响应中。
  3. 后续运行:设置 BROWSERBASE_CONTEXT_ID 跳过登录。

设置

# First run - no context, log in manually via debug URL
BROWSERBASE_API_KEY=bb_...
BROWSERBASE_PROJECT_ID=...

# After logging in, add context ID for subsequent runs
BROWSERBASE_CONTEXT_ID=ctx_...

演出

场景 初始化时间
新会话,无上下文 ~30-45秒
现有上下文 ~5-10秒
重新使用活动会话 ~1-2秒

运作原理

建筑

MCP Client (Claude Code, Cursor, VS Code, etc.)
    │
    └── grammarly_optimize_text tool
        │
        ├── Provider Abstraction
        │    ├── StagehandProvider (default)
        │    │   ├── BrowserbaseSessionManager
        │    │   ├── Stagehand (observe/act/extract)
        │    │   └── Multi-LLM Client
        │    │
        │    └── BrowserUseProvider (fallback)
        │        └── Browser Use SDK
        │
        └── Rewrite Client (multi-provider text rewriting)
            └── Claude Code / OpenAI / Google / Anthropic

分段流

  1. 获取或创建具有可选上下文的Browserbase会话
  2. 初始化连接到会话的Stagehand实例
  3. 导航到app.grammarly.com
  4. 使用 observe() 查找UI元素(新文档按钮、AI检测器)
  5. 使用 act() 进行交互(单击,键入文本)
  6. 使用 extract() 使用Zod模式获得结构化分数
  7. 返回带有调试URL的分数

浏览器使用流程

  1. 使用同步的配置文件创建浏览器使用会话
  2. 将自然语言任务发送给浏览器使用代理
  3. Agent导航Grammarly、粘贴文本、运行检查
  4. 返回结构化分数

优化循环

  1. 初始得分 (迭代0)在原始文本上
  2. 在优化模式下:循环到 max_iterations:
    • LLM(通过 REWRITE_LLM_PROVIDER)根据当前分数、音调、领域重写文本
    • 通过Grammarly重新评分
    • 如果达到阈值,请提前突破
  3. 生成摘要 通过配置的重写LLM提供程序

发展

建造和质量

pnpm install        # Install dependencies
pnpm build          # Compile TypeScript
pnpm type-check     # Type checking only
pnpm biome:check    # Lint + format check
pnpm biome:fix      # Auto-fix lint + format
pnpm check-all      # Type check + lint

测试

pnpm test           # Watch mode
pnpm test:run       # Run once
pnpm test:coverage  # With coverage report
pnpm test:unit      # Unit tests only
pnpm test:integration  # Integration tests

覆盖阈值 (在CI中强制执行):85%的行,85%的功能,75%的分支。

测试使用具有V8覆盖率的Vitest。看 tests/ 用于测试结构和 CLAUDE.md 用于测试惯例。


故障排除

服务器问题

服务器无法启动

检查是否设置了所需的环境变量:

  • 舞台工作人员: BROWSERBASE_API_KEY, BROWSERBASE_PROJECT_ID
  • 浏览器使用: BROWSER_USE_API_KEY, BROWSER_USE_PROFILE_ID

工具未出现在客户端

  • 验证路径 dist/server.js 绝对正确
  • 跑 pnpm build 确保编译成功
  • 配置更改后重新启动MCP客户端

阶段性问题

浏览器基础会话创建失败

上下文未持久化登录

  • 确保在上下文处于活动状态时登录Grammarly
  • 上下文ID必须与发生登录的会话匹配
  • 语法会话可能会过期;需要时重新登录

自我修复的失败

  • Grammarly UI可能发生了重大变化
  • 试试看 LOG_LEVEL=debug 查看Stagehand观察结果
  • 报告持续存在的问题

浏览器使用问题

会话创建失败

配置文件同步问题

  • 使用浏览器使用工具重新同步您的Grammarly登录
  • Grammarly Cookie可能已过期

语法问题

AI检测分数为空

您的Grammarly计划可能不包括AI探测器。这需要启用AI检测的Grammarly Pro。

抄袭分数为零

剽窃检查需要Grammarly Pro订阅。

克劳德问题

身份验证错误

使用CLI身份验证(推荐):

claude logout
claude login

使用API密钥: 确保 CLAUDE_API_KEY 设置正确。


安全注意事项

  • API密钥:安全存放。永远不要承诺版本控制。

  • 浏览器基础上下文:包含会话Cookie。将上下文ID视为敏感。

  • 浏览器使用配置文件:包含Grammarly会话状态。将配置文件ID视为敏感。

  • 数据流:文本通过:

    1. 浏览器基础或浏览器使用云(浏览器自动化)
    2. 语法(通过web UI)
    3. API(用于重写)

    查看每个服务的隐私政策。

  • 本地执行:MCP服务器通过stdio在本地运行,而不是通过网络。


注意事项和限制

  • Grammarly Pro必需:AI检测器和剽窃检查器需要Grammarly Pro。分数返回 null 如果不可用。
  • UI依赖关系:自动化使用观察/动作/提取(舞台手)或自然语言(浏览器使用)。语法UI更改可能会影响可靠性。
  • 文本长度:很长的文本可能超过上下文限制。考虑分块。
  • 速率限制:Browserbase、Browser Use Cloud和Grammarly都有使用限制。
  • 会话限制:浏览器基础会话有超时限制。使用上下文进行持久化。

外部资源


许可证

MIT许可证-请参阅 许可证 了解详情。