npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mcp-server-apple-events

v1.4.0

Published

MCP server that provides native integration with Apple Reminders and Calendar on macOS.

Downloads

1,734

Readme

Apple Events MCP Server Version 1.3.0 License: MIT

Twitter Follow

English | 简体中文

一个为 macOS 提供原生 Apple Reminders 和 Calendar 集成的 Model Context Protocol (MCP) 服务器。该服务器允许你通过标准化接口与 Apple Reminders 和 Calendar Events 进行交互,具有全面的管理功能。

MseeP.ai Security Assessment Badge

功能特性

核心功能

  • 列表管理:查看所有提醒事项和提醒事项列表的高级过滤选项
  • 提醒事项操作:完整的CRUD操作(创建、读取、更新、删除)提醒事项
  • 丰富内容支持:完全支持标题、备注、截止日期、URL和完成状态
  • 原生macOS集成:使用EventKit框架直接与Apple Reminders集成

增强提醒功能 (v1.3.0)

  • 优先级支持:设置提醒优先级(高/中/低/无),并带有视觉指示器
  • 重复提醒:创建具有灵活重复规则(每日、每周、每月、每年)的重复提醒
  • 基于位置的触发器:设置地理围栏提醒,在到达或离开某个位置时触发
  • 标签/标签:使用自定义标签组织提醒事项,以便进行跨列表分类和过滤
  • 子任务/清单:向提醒事项添加带有进度跟踪的清单项目

高级功能

  • 智能组织:按优先级、截止日期、类别或完成状态的自动分类 and 智能过滤
  • 强大搜索:包括完成状态、截止日期范围、标签和全文搜索的多条件过滤
  • 批量操作:使用优化的数据访问模式高效处理多个提醒事项
  • 权限管理:自动验证和请求所需的macOS系统权限
  • 灵活日期处理:支持多种日期格式(YYYY-MM-DD、ISO 8601)并具有时区感知能力
  • Unicode支持:完整的国际字符支持和全面的输入验证

技术优势

  • Clean Architecture:遵循Clean Architecture原则的4层架构,包含依赖注入
  • 类型安全:使用Zod模式验证进行运行时类型检查的完整TypeScript覆盖
  • 高性能:用于Apple Reminders性能关键操作的Swift编译二进制文件
  • 健壮的错误处理:具有详细诊断信息的一致错误响应
  • Repository Pattern:标准化的CRUD操作的数据访问抽象
  • 函数式编程:在适当情况下使用纯函数和不可变数据结构

系统要求

  • Node.js 18 或更高版本
  • macOS(Apple Reminders 集成所需)
  • Xcode Command Line Tools(编译 Swift 代码所需)
  • pnpm(推荐用于包管理)

macOS 权限要求(Sonoma 14+ / Sequoia 15)

Apple 已将提醒事项和日历权限拆分为「仅写入」与「完全访问」范围。Swift 桥接层声明了以下隐私键,确保在你授权后 Claude 可以安全读取并写入所选数据:

  • NSRemindersUsageDescription
  • NSRemindersFullAccessUsageDescription
  • NSRemindersWriteOnlyAccessUsageDescription
  • NSCalendarsUsageDescription
  • NSCalendarsFullAccessUsageDescription
  • NSCalendarsWriteOnlyAccessUsageDescription

当授权状态为 notDetermined 时,CLI 会调用 requestFullAccessToReminders / requestFullAccessToEvents,macOS 会弹出对应的授权对话框。如果系统遗失权限记录,可运行 ./check-permissions.sh 重新触发请求。

若 Claude 的工具调用依旧遇到权限错误,Node.js 层会自动运行一段最小化的 AppleScript(osascript -e 'tell application "Reminders" …')来唤起系统弹窗,然后再次重试 Swift CLI。

日历读取报错排查

如果看到 Failed to read calendar events,请先确认日历权限已设置为 Full Calendar Access

  • 打开 System Settings > Privacy & Security > Calendars
  • 找到启动 MCP 服务的应用(例如 Terminal 或 Claude Desktop)
  • 将权限切换为 Full Calendar Access

你也可以重新运行 ./check-permissions.sh(脚本现在会同时检查 Reminders 与 Calendars 权限)。

验证命令

pnpm test -- src/swift/Info.plist.test.ts

测试会确保所有必须的 usage-description 字段在发布前均已就绪。

快速开始

你可以直接使用 npx 运行服务器:

npx mcp-server-apple-events

配置说明

配置 Cursor

  1. 打开 Cursor
  2. 打开 Cursor 设置
  3. 点击侧边栏中的 "MCP"
  4. 点击 "Add new global MCP server"
  5. 使用以下设置配置服务器:
    {
      "mcpServers": {
        "apple-reminders": {
          "command": "npx",
          "args": ["-y", "mcp-server-apple-events"]
        }
      }
    }

配置 ChatWise

  1. 打开 ChatWise
  2. 进入设置
  3. 导航至工具部分
  4. 点击 "+" 按钮
  5. 使用以下设置配置工具:
    • 类型:stdio
    • ID:apple-reminders
    • 命令:mcp-server-apple-events
    • 参数:(留空)

配置 Claude Desktop

你需要配置 Claude Desktop 以识别 Apple Events MCP 服务器。有两种方式可以访问配置:

方式 1:通过 Claude Desktop 界面

  1. 打开 Claude Desktop 应用
  2. 从左上角菜单栏启用开发者模式
  3. 打开设置并导航至开发者选项
  4. 点击编辑配置按钮打开 claude_desktop_config.json

方式 2:直接访问文件

macOS:

code ~/Library/Application\ Support/Claude/claude_desktop_config.json

Windows:

code %APPDATA%\Claude\claude_desktop_config.json

2. 添加服务器配置

将以下配置添加到你的 claude_desktop_config.json

{
  "mcpServers": {
    "apple-reminders": {
      "command": "npx",
      "args": ["-y", "mcp-server-apple-events"]
    }
  }
}

3. 重启 Claude Desktop

要使更改生效:

  1. 完全退出 Claude Desktop(不仅仅是关闭窗口)
  2. 重新启动 Claude Desktop
  3. 查看工具图标以验证 Apple Events 服务器是否已连接

使用示例

配置完成后,你可以让 Claude 与你的 Apple Reminders 进行交互。以下是一些示例提示:

创建提醒事项

创建一个明天下午 5 点的"买杂货"提醒。
添加一个"打电话给妈妈"的提醒,备注"询问周末计划"。
在"工作"列表中创建一个下周五到期的"提交报告"提醒。
创建一个带URL的提醒"查看这个网站:https://google.com"。

创建带有优先级的提醒

创建一个周五到期的"完成季度报告"高优先级提醒。
添加一个今天到期的"给客户回电话"紧急高优先级提醒。
创建一个"审阅文档"中等优先级提醒。

创建重复提醒

创建一个每天上午 9 点"服药"的提醒。
每周一添加一个"团队站会"提醒。
在每月 1 号创建一个"交房租"提醒。
在 3 月 15 日设置一个"报税"年度提醒。

创建基于位置的提醒

提醒我在到达杂货店时"买牛奶"。
创建一个在我回家时"检查信箱"的提醒。
添加一个在我离开办公室时"提交工时表"的提醒。

创建带有标签的提醒

创建一个带有 work 和 urgent 标签的提醒 "Review PR"。
添加一个带有 personal 和 shopping 标签的提醒 "Buy birthday gift"。
创建一个带有 project-alpha, backend, review 标签的提醒。

创建带有子任务的提醒

创建一个提醒 "Grocery shopping",包含子任务:milk, eggs, bread, butter。
添加一个提醒 "Pack for trip",包含清单项目:passport, charger, clothes, toiletries。
创建 "Sprint planning",包含子任务:review backlog, estimate stories, assign tasks。

管理子任务

显示我的 "Grocery shopping" 提醒的子任务。
将 "milk" 子任务标记为已完成。
向我的购物列表提醒添加一个新的子任务 "cheese"。
重新排序我打包清单中的子任务。

过滤提醒

显示所有高优先级提醒。
显示带有 "work" 标签的提醒。
仅显示重复提醒。
查找基于位置的提醒。
显示带有未完成子任务的提醒。

更新提醒事项

将"买杂货"提醒的标题更新为"买有机杂货"。
将"打电话给妈妈"提醒更新为今天下午 6 点到期。
更新"提交报告"提醒并将其标记为已完成。
将"买杂货"的备注更改为"别忘了牛奶和鸡蛋"。
在我的"完成报告"提醒上将优先级设置为高。
向我的 "Review PR" 提醒添加标签 "urgent"。

管理提醒事项

显示我的所有提醒事项。
列出"购物"列表中的所有提醒事项。
显示我已完成的提醒事项。

处理列表

显示所有提醒事项列表。
显示"工作"列表中的提醒事项。

服务器将:

  • 处理你的自然语言请求
  • 与 Apple 原生提醒事项应用交互
  • 向 Claude 返回格式化结果
  • 维护与 macOS 的原生集成

结构化提示库

该服务器提供统一的提示注册表,可通过 MCP 的 ListPromptsGetPrompt 端点访问。每个模板都共享使命、上下文输入、编号流程、约束、输出格式和质量标准,让下游助手获得可预测的框架,而无需解析松散的自由格式示例。

  • daily-task-organizer —— 可选 today_focus(你今天最想完成的重点)生成当日执行蓝图,在优先级工作与恢复时间之间保持平衡。支持智能任务聚类、专注时间段安排、自动提醒列表组织,并会在大量今日到期的提醒需要固定时段时,按照到期时间自动创建日历时间块。快速完成类任务簇会转换为以提醒到期时间结束的 15 分钟「Focus Sprint — [Outcome]」日历占位,而标准任务则对应 30 、45 或 60 分钟的事件,并以同一到期时间窗口为锚点。
  • smart-reminder-creator —— 可选 task_idea(你想做的一句话描述),生成优化调度的提醒结构。
  • reminder-review-assistant —— 可选 review_focus(如“逾期”或某个清单名)用于审计与优化现有提醒。
  • weekly-planning-workflow —— 可选 user_ideas(您本周想要完成的想法和目标)指导周一至周日的重置,时间区块与现有列表相关联。

设计约束与验证

  • 提示严格限制在 Apple Reminders 原生能力范围内(无第三方自动化),并在提交不可逆操作前询问缺失上下文。
  • 共享格式使输出可渲染为 Markdown 部分或表格,无需客户端应用程序的额外解析胶水。
  • 每次修改提示文案后运行 pnpm test -- src/server/prompts.test.ts 以断言元数据、模式兼容性和叙述组装。

可用的 MCP 工具

服务器现在按照服务域暴露 MCP 工具,对应提醒事项与日历的不同资源:

提醒事项任务工具

工具名称reminders_tasks

用于管理单个提醒事项任务,支持完整的 CRUD 操作,包括优先级、提醒(alarms)、重复规则(recurrence rules)、开始/到期/完成时间、位置触发器、标签和子任务。

操作readcreateupdatedelete

主要处理函数

  • handleReadReminders() - 带筛选选项读取提醒事项
  • handleCreateReminder() - 创建新的提醒事项
  • handleUpdateReminder() - 更新现有提醒事项
  • handleDeleteReminder() - 删除提醒事项

按操作的参数

读取操作action: "read"):

  • id (可选):要读取的特定提醒事项的唯一标识符
  • filterList (可选):要展示的提醒事项列表名称
  • showCompleted (可选):是否包含已完成的提醒事项(默认:false)
  • search (可选):根据标题或内容筛选提醒事项的搜索词
  • dueWithin (可选):按到期范围筛选("today"、"tomorrow"、"this-week"、"overdue"、"no-date")
  • filterPriority (可选):按优先级级别筛选 ("high", "medium", "low", "none")
  • filterRecurring (可选):仅显示重复提醒
  • filterLocationBased (可选):仅显示基于位置的提醒
  • filterTags (可选):按标签筛选(必须具有所有指定标签)

创建操作action: "create"):

  • title (必填):提醒事项标题
  • startDate (可选):开始时间,格式为 YYYY-MM-DDYYYY-MM-DD HH:mm:ss
  • dueDate (可选):到期时间,格式为 YYYY-MM-DDYYYY-MM-DD HH:mm:ss
  • targetList (可选):要添加到的提醒事项列表名称
  • note (可选):提醒事项备注内容
  • url (可选):与提醒事项关联的 URL
  • location (可选):位置文本(EKCalendarItem.location,不是地理围栏触发器)
  • priority (可选):优先级级别 (0=无, 1=高, 5=中, 9=低)
  • alarms (可选):提醒数组(见下方「提醒对象」)
  • recurrenceRules (可选):重复规则数组(见下方「重复规则对象」)
  • recurrence (可选):兼容旧写法的单个重复规则(等价于单元素 recurrenceRules
  • locationTrigger (可选):位置触发器对象
  • tags (可选):要添加到提醒的标签数组
  • subtasks (可选):要随提醒创建的子任务标题数组

更新操作action: "update"):

  • id (必填):要更新的提醒事项唯一标识符
  • title (可选):提醒事项新标题
  • startDate (可选):新的开始时间
  • dueDate (可选):新的到期时间,格式为 YYYY-MM-DDYYYY-MM-DD HH:mm:ss
  • note (可选):新的备注内容
  • url (可选):新的 URL
  • location (可选):新的位置文本(传空字符串可清空)
  • completed (可选):设置提醒事项完成状态
  • completionDate (可选):设置显式完成时间
  • targetList (可选):提醒事项所在列表
  • priority (可选):新优先级级别 (0=无, 1=高, 5=中, 9=低)
  • alarms (可选):用此数组替换所有提醒
  • clearAlarms (可选):设置为 true 以移除所有提醒
  • recurrenceRules (可选):用此数组替换所有重复规则
  • recurrence (可选):兼容旧写法的单个重复规则
  • clearRecurrence (可选):设置为 true 以移除重复规则
  • locationTrigger (可选):新位置触发器
  • clearLocationTrigger (可选):设置为 true 以移除位置触发器
  • tags (可选):用此数组替换所有标签
  • addTags (可选):要添加的标签
  • removeTags (可选):要移除的标签

删除操作action: "delete"):

  • id (必填):要删除的提醒事项唯一标识符

提醒对象(Alarm Object)

{
  "relativeOffset": -900,            // 秒(相对到期/开始时间),负数表示提前
  "absoluteDate": "2025-11-04T09:00:00+08:00", // 绝对触发时间(可选)
  "locationTrigger": {               // 地理围栏触发(可选)
    "title": "办公室",
    "latitude": 37.7749,
    "longitude": -122.4194,
    "radius": 100,
    "proximity": "enter"
  }
}

每个提醒对象必须且只能指定 relativeOffsetabsoluteDatelocationTrigger 之一。

重复规则对象(用于 recurrenceRules

{
  "frequency": "daily" | "weekly" | "monthly" | "yearly",
  "interval": 1,           // 每 N 个周期 (默认: 1)
  "endDate": "YYYY-MM-DD", // 可选结束日期
  "occurrenceCount": 10,   // 可选最大发生次数
  "daysOfWeek": [1, 3, 5], // 1=周日, 7=周六 (用于每周)
  "daysOfMonth": [1, 15],  // 1-31 (用于每月)
  "monthsOfYear": [3, 6]   // 1-12 (用于每年)
}

位置触发器对象

{
  "title": "家", // 地点名称
  "latitude": 37.7749, // 纬度
  "longitude": -122.4194, // 经度
  "radius": 100, // 地理围栏半径(米,默认: 100)
  "proximity": "enter" // "enter" (到达) 或 "leave" (离开)
}

使用示例

{
  "action": "create",
  "title": "购买食材",
  "dueDate": "2024-03-25 18:00:00",
  "targetList": "购物",
  "note": "别忘了牛奶和鸡蛋",
  "priority": 1,
  "tags": ["shopping", "errands"],
  "subtasks": ["牛奶", "鸡蛋", "面包"]
}

提醒事项子任务工具

工具名称reminders_subtasks

管理提醒事项中的子任务/清单。子任务使用人类可读的格式存储在备注字段中,在原生提醒事项应用中可见。

操作read, create, update, delete, toggle, reorder

主要处理函数

  • handleReadSubtasks() - 列出提醒的所有子任务
  • handleCreateSubtask() - 添加新子任务
  • handleUpdateSubtask() - 修改子任务
  • handleDeleteSubtask() - 移除子任务
  • handleToggleSubtask() - 切换完成状态
  • handleReorderSubtasks() - 更改子任务顺序

使用示例

{
  "action": "read",
  "reminderId": "reminder-123"
}

提醒事项列表工具

工具名称reminders_lists

用于管理提醒事项列表 —— 查看现有列表或创建新的列表来组织提醒事项。

操作readcreateupdatedelete

主要处理函数

  • handleReadReminderLists() - 读取所有提醒事项列表
  • handleCreateReminderList() - 创建新的提醒事项列表
  • handleUpdateReminderList() - 更新现有提醒事项列表
  • handleDeleteReminderList() - 删除提醒事项列表

使用示例

{
  "action": "create",
  "name": "项目 Alpha"
}

日历事件工具

工具名称calendar_events

用于处理 EventKit 日历事件(时间块),提供 CRUD 能力。

操作readcreateupdatedelete

主要处理函数

  • handleReadCalendarEvents() - 带可选筛选读取事件
  • handleCreateCalendarEvent() - 创建日历事件
  • handleUpdateCalendarEvent() - 更新现有事件
  • handleDeleteCalendarEvent() - 删除日历事件

按操作的参数

读取操作action: "read"):

  • id (可选):读取单个事件的唯一标识符
  • filterCalendar (可选):按日历名称筛选
  • search (可选):按标题/备注/地点搜索
  • availability (可选):按可用性筛选("busy"、"free"、"tentative"、"unavailable"、"not-supported")
  • startDateendDate (可选):按时间范围筛选

创建操作action: "create"):

  • title (必填):事件标题
  • startDate (必填):开始时间
  • endDate (必填):结束时间
  • targetCalendar (可选):目标日历名称
  • notelocationstructuredLocationurlisAllDay (可选):基础字段
  • availability (可选):可用性("busy"、"free"、"tentative"、"unavailable")
  • alarms (可选):提醒数组(见上方「提醒对象」)
  • recurrenceRules (可选):重复规则数组(见上方「重复规则对象」)

更新操作action: "update"):

  • id (必填):事件唯一标识符
  • 其余字段同创建操作,均为可选更新
  • clearAlarms (可选):设置为 true 以移除所有提醒
  • clearRecurrence (可选):设置为 true 以移除所有重复规则
  • span (可选):循环事件变更范围:"this-event""future-events"

删除操作action: "delete"):

  • id (必填):事件唯一标识符
  • span (可选):循环事件删除范围:"this-event""future-events"

日历集合工具

工具名称calendar_calendars

用于返回 EventKit 中可用的日历集合。在创建或更新事件前可先确认日历标识。

操作read

主要处理函数

  • handleReadCalendars() - 列出所有日历的 ID 与名称

响应格式

带有增强功能的提醒事项

读取提醒事项时,输出包含增强功能的视觉指示器:

  • 🔄 - 重复提醒
  • 📍 - 基于位置的提醒
  • 🏷️ - 带有标签
  • 📋 - 带有子任务

示例输出:

- [ ] 购买杂货 🏷️📋
  - 列表: 购物
  - ID: reminder-123
  - 优先级: 高
  - 标签: #shopping #errands
  - 子任务 (1/3):
    - [x] 牛奶
    - [ ] 鸡蛋
    - [ ] 面包
  - 到期: 2024-03-25 18:00:00

组织策略

服务器通过四个内置策略提供智能提醒事项组织功能:

优先级策略

基于优先级关键词自动分类提醒事项:

  • 高优先级:包含"紧急"、"重要"、"关键"、"紧急"等词
  • 中优先级:标准提醒事项的默认类别
  • 低优先级:包含"稍后"、"某天"、"最终"、"也许"等词

截止日期策略

基于提醒事项的截止日期进行组织:

  • 已过期:过去的截止日期
  • 今天:今天到期的提醒事项
  • 明天:明天到期的提醒事项
  • 本周:本周内到期的提醒事项
  • 下周:下周到期的提醒事项
  • 未来:下周之后到期的提醒事项
  • 无日期:没有截止日期的提醒事项

类别策略

通过内容分析智能分类提醒事项:

  • 工作:商务、会议、项目、办公室、客户相关
  • 个人:家庭、朋友、自我护理相关
  • 购物:购买、商店、采购、杂货相关
  • 健康:医生、运动、医疗、健身、锻炼相关
  • 财务:账单、付款、金融、银行、预算相关
  • 旅行:旅行、假期、航班、酒店相关
  • 教育:学习、课程、学校、书籍、研究相关
  • 未分类:不匹配任何特定类别的提醒事项

完成状态策略

简单的二元组织:

  • 活跃:未完成的提醒事项
  • 已完成:已完成的提醒事项

标签系统

标签为提醒事项提供跨列表分类。它们使用 [#tag] 格式存储在备注字段中,这使得它们在原生提醒事项应用中保持人类可读。

标签格式

标签存储在备注末尾:

用户备注...

[#work] [#urgent] [#project-alpha]

标签规则

  • 标签可以包含字母、数字、下划线和连字符
  • 每个标签最多 50 个字符
  • 区分大小写
  • 按多个标签过滤使用 AND 逻辑(提醒必须具有所有指定的标签)

开发

  1. 使用 pnpm 安装依赖(保持 Swift 桥接与 TypeScript 版本一致):
pnpm install
  1. 在启动前构建 Swift 二进制(TypeScript 使用运行时执行):
pnpm build
  1. 运行全量测试,验证 TypeScript、Swift 桥接和提示模板:
pnpm test
  1. 在提交前执行 Biome 检查:
pnpm exec biome check

嵌套目录启动

CLI 入口内建项目根目录回退逻辑。即使从 dist/ 等子目录或编辑器任务运行器启动,服务器也能在向上最多十层目录内定位 package.json 并加载随附的 Swift 二进制。若你自定义目录结构,请确保清单文件仍在该查找深度之内,以维持这一保证。

可用脚本

  • pnpm build - 构建 Swift 二进制文件(启动服务器前必需)
  • pnpm build:swift - 仅构建 Swift 二进制文件
  • pnpm dev - 通过 tsx 以文件监视模式运行 TypeScript 开发服务器(运行时 TS 执行)
  • pnpm start - 通过 stdio 启动 MCP 服务器(如果没有构建则自动回退到运行时 TS)
  • pnpm test - 运行完整的 Jest 测试套件
  • pnpm check - 运行 Biome 格式化和 TypeScript 类型检查

依赖

运行时依赖:

  • @modelcontextprotocol/sdk ^1.25.1 - MCP 协议实现
  • exit-on-epipe ^1.0.1 - 优雅的进程终止处理
  • tsx ^4.21.0 - TypeScript 执行和 REPL
  • zod ^4.3.5 - 运行时类型验证

开发依赖:

  • typescript ^5.9.3 - TypeScript 编译器
  • @types/node ^25.0.3 - Node.js 类型定义
  • @types/jest ^30.0.0 - Jest 类型定义
  • jest ^30.2.0 - 测试框架
  • babel-jest ^30.2.0 - Babel Jest 转换器
  • babel-plugin-transform-import-meta ^2.3.3 - Babel 导入元转换
  • ts-jest ^29.4.6 - Jest TypeScript 支持
  • @biomejs/biome ^2.3.11 - 代码格式化和静态检查

构建工具:

  • Swift 二进制文件用于原生 macOS 集成
  • TypeScript 编译用于跨平台兼容性

License

MIT

Contributing

Contributions welcome! Please read the contributing guidelines first.