Skip to main content
Glama
README.md
# NodeLoc MCP

[English](#english) · [中文](#中文)

---

## English

An MCP (Model Context Protocol) server for the [NodeLoc](https://www.nodeloc.com) community (TypeScript). It lets any MCP-compatible AI client — Claude Desktop, Cursor, Cherry Studio, Cline, … — work with the forum through natural language: browse/post topics, private messages, likes/bookmarks/polls, nested communities (nodes), chat, daily check-in, red envelopes, energy-point rewards, the official payment API, knowledge-base lookup, and miniprogram CLI operations.

**42 tools** in total; tool descriptions are in English. Works with any MCP client over stdio.

### Feature groups

| Group | Tools |
|---|---|
| Account | `get_current_user` |
| Browsing | `list_latest_topics` `list_top_topics` `read_topic` `list_category_topics` `get_site_info` `get_user_profile` `get_user_summary` `search_users` |
| Notifications / PM | `list_notifications` `mark_notifications_read` `list_private_messages` `send_private_message` |
| Writing | `create_topic` `reply_to_topic` |
| Interaction | `like_post` `unlike_post` `bookmark_post` `vote_poll` `unvote_poll` |
| Nodes | `list_nodes` `list_node_topics` `join_node` `leave_node` `create_node` `check_node_slug` |
| Chat | `get_chat_messages` `get_chat_thread_messages` `send_chat_message` `mark_chat_read` |
| Energy | `checkin` `create_red_envelope` `give_reward` `get_points_history` `get_points_scores` |
| Payment (official API) | `payment_create` `payment_query` `payment_transfer` |
| Knowledge base | `docs_list_pages` `docs_get_page` `docs_search` |
| Miniprograms | `apps_cli` |

### Requirements & build

Requires **Node.js ≥ 20** (uses `fetch` and `headers.getSetCookie()`).

```bash
npm install
npm run build        # bundles everything into a single dist/index.js (~760 KB)
```

`dist/index.js` is self-contained — to distribute, ship this one file plus a Node runtime; no `npm install` needed on the target machine.

### Configuration (environment variables)

| Variable | Required | Description |
|---|---|---|
| `NODELOC_USERNAME` | ✅ | Forum username or email |
| `NODELOC_PASSWORD` | ✅ | Forum password (only used to obtain a cookie session; the session is stored in a local file) |
| `NODELOC_BASE_URL` | | Default `https://www.nodeloc.com` |
| `NODELOC_TIMEZONE` | | Default `Asia/Shanghai` |
| `NODELOC_LOCALE` | | Default `zh-CN` (used by the check-in request header) |
| `NODELOC_SECOND_FACTOR_METHOD` | | 2FA: `0` none / `1` SMS / `2` TOTP, default `0` |
| `NODELOC_PAYMENT_ID` | payment tools | Payment app ID (`pay_xxx`), apply at [payment/applications](https://www.nodeloc.com/payment/applications) (TL1+, admin approval) |
| `NODELOC_PAYMENT_TOKEN` | payment tools | Payment app token (`tk_xxx`) |
| `NODELOC_APPS_CLI` | apps tools | `nodeloc-apps` CLI path, defaults to PATH lookup |
| `NODELOC_DATA_DIR` | | Session/docs cache directory, default `~/.nodeloc-mcp` |

> Note: NodeLoc has disabled the Discourse User-Api-Key flow, so this server uses **cookie-session** auth (same as the official app): `POST /session` login → session persisted locally → automatic re-login on expiry.

### MCP client example

```json
{
  "mcpServers": {
    "nodeloc": {
      "command": "node",
      "args": ["/absolute/path/to/dist/index.js"],
      "env": {
        "NODELOC_USERNAME": "your_username",
        "NODELOC_PASSWORD": "your_password"
      }
    }
  }
}
```

### Project structure

```
src/
├── config.ts        # environment configuration
├── client.ts        # HTTP client + cookie-session auth (Cloudflare detection, auto re-login, session persistence)
├── index.ts         # MCP entry, registers 42 tools (English descriptions)
└── tools/
    ├── forum.ts     # topics/posts/PMs/interactions/nodes/chat
    ├── energy.ts    # check-in/red envelopes/rewards/points
    ├── payment.ts   # official payment API (HMAC-SHA256 signing)
    ├── docs.ts      # knowledge base (llms.txt index + Markdown cache)
    └── apps.ts      # nodeloc-apps CLI wrapper
```

### Known limitations

- **Miniprogram development access** requires a manual admin approval and cannot be automated; `apps_cli` only wraps an existing CLI (interactive commands like `login` must be run once in a terminal yourself)
- **OAuth** (docs.nodeloc.com) is an outbound service — "log in to third-party sites with your NodeLoc account" — unrelated to this server's forum auth, not included
- The check-in endpoint enforces nonce + timestamp anti-cheat validation; write operations are rate-limited by the forum, and server errors are passed through
- MessageBus real-time long-polling is not implemented (of limited use in a request-driven MCP model)

### References

- Official docs: https://docs.nodeloc.com/ ([llms.txt](https://docs.nodeloc.com/llms.txt))

---

## 中文

[NodeLoc](https://www.nodeloc.com) 论坛的 MCP(Model Context Protocol)服务器(TypeScript 实现),让 AI 助手直接操作论坛:浏览/发帖/私信/点赞/投票、节点社区、聊天、每日签到、红包、打赏、积分查询、官方支付 API、知识库检索、小程序 CLI 操作。

共 **42 个工具**,工具描述为英文,适用于任意 MCP 客户端(Claude Desktop、Cursor、Cherry Studio、Cline 等)。

### 功能一览

| 分组 | 工具 |
|---|---|
| 账号 | `get_current_user` |
| 浏览 | `list_latest_topics` `list_top_topics` `read_topic` `list_category_topics` `get_site_info` `get_user_profile` `get_user_summary` `search_users` |
| 通知/私信 | `list_notifications` `mark_notifications_read` `list_private_messages` `send_private_message` |
| 写作 | `create_topic` `reply_to_topic` |
| 互动 | `like_post` `unlike_post` `bookmark_post` `vote_poll` `unvote_poll` |
| 节点社区 | `list_nodes` `list_node_topics` `join_node` `leave_node` `create_node` `check_node_slug` |
| 聊天 | `get_chat_messages` `get_chat_thread_messages` `send_chat_message` `mark_chat_read` |
| 能量 | `checkin` `create_red_envelope` `give_reward` `get_points_history` `get_points_scores` |
| 支付(官方 API) | `payment_create` `payment_query` `payment_transfer` |
| 知识库 | `docs_list_pages` `docs_get_page` `docs_search` |
| 小程序 | `apps_cli` |

### 安装与构建

要求 **Node.js ≥ 20**(用了 `fetch` 和 `headers.getSetCookie()`)。

```bash
npm install
npm run build        # 打包成单文件 dist/index.js(约 760 KB,含全部依赖)
```

打包后的 `dist/index.js` 是自包含的单文件——分发给别人时只需这一个文件 + Node 运行时,无需 npm install。

### 配置(环境变量)

| 变量 | 必填 | 说明 |
|---|---|---|
| `NODELOC_USERNAME` | ✅ | 论坛用户名或邮箱 |
| `NODELOC_PASSWORD` | ✅ | 论坛密码(仅用于登录换取 Cookie 会话,会话仅存本地文件) |
| `NODELOC_BASE_URL` | | 默认 `https://www.nodeloc.com` |
| `NODELOC_TIMEZONE` | | 默认 `Asia/Shanghai` |
| `NODELOC_LOCALE` | | 默认 `zh-CN`(签到请求头用) |
| `NODELOC_SECOND_FACTOR_METHOD` | | 2FA 方式:`0` 无 / `1` 短信 / `2` TOTP,默认 `0` |
| `NODELOC_PAYMENT_ID` | 支付工具需要 | 支付应用 ID(`pay_xxx`),[申请入口](https://www.nodeloc.com/payment/applications)(TL1+,需审批) |
| `NODELOC_PAYMENT_TOKEN` | 支付工具需要 | 支付应用 token(`tk_xxx`) |
| `NODELOC_APPS_CLI` | 小程序工具需要 | `nodeloc-apps` CLI 路径,默认从 PATH 查找 |
| `NODELOC_DATA_DIR` | | 会话与文档缓存目录,默认 `~/.nodeloc-mcp` |

> 注:NodeLoc 站点已禁用 Discourse User-Api-Key,因此采用 **Cookie 会话**鉴权(与官方 App 相同):`POST /session` 登录 → 会话持久化到本地 → 过期自动重新登录。

### MCP 客户端接入示例

```json
{
  "mcpServers": {
    "nodeloc": {
      "command": "node",
      "args": ["/绝对路径/dist/index.js"],
      "env": {
        "NODELOC_USERNAME": "your_username",
        "NODELOC_PASSWORD": "your_password"
      }
    }
  }
}
```

### 项目结构

```
src/
├── config.ts        # 环境变量配置
├── client.ts        # HTTP 客户端 + Cookie 会话鉴权(Cloudflare 检测、自动重登、会话持久化)
├── index.ts         # MCP 入口,注册 42 个工具(英文描述)
└── tools/
    ├── forum.ts     # 主题/帖子/私信/互动/节点/聊天
    ├── energy.ts    # 签到/红包/打赏/积分
    ├── payment.ts   # 官方支付 API(HMAC-SHA256 签名)
    ├── docs.ts      # 知识库(llms.txt 索引 + Markdown 缓存)
    └── apps.ts      # nodeloc-apps CLI 封装
```

### 已知边界

- **小程序开发权限**需人工向管理员申请,无法自动化;`apps_cli` 仅封装已有 CLI(`login` 等交互式命令需先在终端手动执行一次)
- **OAuth**(docs.nodeloc.com 的 OAuth 对接)是"用 NodeLoc 账号登录第三方平台"的对外服务,与本 MCP 的论坛鉴权无关,未纳入
- 签到接口有 nonce + 时间戳反作弊校验;写操作受论坛频率限制,工具会透传服务端错误
- MessageBus 实时长轮询未实现(MCP 按需调用模型下意义有限)

### 参考

- 官方文档:https://docs.nodeloc.com/ ([llms.txt](https://docs.nodeloc.com/llms.txt))

TDQS

B3.1/5.0

Scored across 42 tools

Disambiguation4/5

Most tools target distinct actions and resources, with clear boundaries between topic listing, node membership, chat, points, and payments. A few pairs like get_user_profile vs get_user_summary or list_latest_topics vs list_top_topics could cause minor hesitation, but descriptions generally make the differences clear.

Naming Consistency3/5

The set uses recognizable patterns for many groups (list_*, get_*, create_*, payment_*, docs_*), but mixes read verbs inconsistently: get_current_user, list_latest_topics, read_topic. Some actions are unprefixed like checkin, and payment tools use prefix-noun while most others use verb-noun, so the naming is readable but not uniform.

Tool Count2/5

With 42 tools, the server exceeds the threshold where a tool set feels heavy and hard to navigate. The broad domain explains part of the size, but many tools are granular variants that could be consolidated without losing clarity.

Completeness3/5

The server covers a wide range of community features: topics, posts, PMs, nodes, chat, points, payments, and docs. However, there are notable gaps such as no topic search, no update/delete for topics or posts, no node update/delete, and no chat channel discovery or management, leaving important workflows incomplete.

Maintenance

ActivityMaintained
ResponsivenessNo issues