@dougis/markdown-lint-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/CONTRIBUTING.md +474 -0
  3. package/LICENSE +21 -0
  4. package/README.md +240 -0
  5. package/USAGE.md +40 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +39 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/rules/index.d.ts +22 -0
  11. package/dist/rules/index.d.ts.map +1 -0
  12. package/dist/rules/index.js +144 -0
  13. package/dist/rules/index.js.map +1 -0
  14. package/dist/rules/md001.d.ts +25 -0
  15. package/dist/rules/md001.d.ts.map +1 -0
  16. package/dist/rules/md001.js +79 -0
  17. package/dist/rules/md001.js.map +1 -0
  18. package/dist/rules/md003.d.ts +41 -0
  19. package/dist/rules/md003.d.ts.map +1 -0
  20. package/dist/rules/md003.js +130 -0
  21. package/dist/rules/md003.js.map +1 -0
  22. package/dist/rules/md004.d.ts +28 -0
  23. package/dist/rules/md004.d.ts.map +1 -0
  24. package/dist/rules/md004.js +79 -0
  25. package/dist/rules/md004.js.map +1 -0
  26. package/dist/rules/md005.d.ts +21 -0
  27. package/dist/rules/md005.d.ts.map +1 -0
  28. package/dist/rules/md005.js +88 -0
  29. package/dist/rules/md005.js.map +1 -0
  30. package/dist/rules/md007.d.ts +21 -0
  31. package/dist/rules/md007.d.ts.map +1 -0
  32. package/dist/rules/md007.js +66 -0
  33. package/dist/rules/md007.js.map +1 -0
  34. package/dist/rules/md009.d.ts +35 -0
  35. package/dist/rules/md009.d.ts.map +1 -0
  36. package/dist/rules/md009.js +122 -0
  37. package/dist/rules/md009.js.map +1 -0
  38. package/dist/rules/md010.d.ts +34 -0
  39. package/dist/rules/md010.d.ts.map +1 -0
  40. package/dist/rules/md010.js +75 -0
  41. package/dist/rules/md010.js.map +1 -0
  42. package/dist/rules/md011.d.ts +30 -0
  43. package/dist/rules/md011.d.ts.map +1 -0
  44. package/dist/rules/md011.js +123 -0
  45. package/dist/rules/md011.js.map +1 -0
  46. package/dist/rules/md012.d.ts +33 -0
  47. package/dist/rules/md012.d.ts.map +1 -0
  48. package/dist/rules/md012.js +125 -0
  49. package/dist/rules/md012.js.map +1 -0
  50. package/dist/rules/md013.d.ts +26 -0
  51. package/dist/rules/md013.d.ts.map +1 -0
  52. package/dist/rules/md013.js +32 -0
  53. package/dist/rules/md013.js.map +1 -0
  54. package/dist/rules/md014.d.ts +29 -0
  55. package/dist/rules/md014.d.ts.map +1 -0
  56. package/dist/rules/md014.js +176 -0
  57. package/dist/rules/md014.js.map +1 -0
  58. package/dist/rules/md018.d.ts +22 -0
  59. package/dist/rules/md018.d.ts.map +1 -0
  60. package/dist/rules/md018.js +27 -0
  61. package/dist/rules/md018.js.map +1 -0
  62. package/dist/rules/md019.d.ts +22 -0
  63. package/dist/rules/md019.d.ts.map +1 -0
  64. package/dist/rules/md019.js +27 -0
  65. package/dist/rules/md019.js.map +1 -0
  66. package/dist/rules/md020.d.ts +22 -0
  67. package/dist/rules/md020.d.ts.map +1 -0
  68. package/dist/rules/md020.js +27 -0
  69. package/dist/rules/md020.js.map +1 -0
  70. package/dist/rules/md021.d.ts +22 -0
  71. package/dist/rules/md021.d.ts.map +1 -0
  72. package/dist/rules/md021.js +27 -0
  73. package/dist/rules/md021.js.map +1 -0
  74. package/dist/rules/md022.d.ts +21 -0
  75. package/dist/rules/md022.d.ts.map +1 -0
  76. package/dist/rules/md022.js +43 -0
  77. package/dist/rules/md022.js.map +1 -0
  78. package/dist/rules/md023.d.ts +21 -0
  79. package/dist/rules/md023.d.ts.map +1 -0
  80. package/dist/rules/md023.js +34 -0
  81. package/dist/rules/md023.js.map +1 -0
  82. package/dist/rules/md024.d.ts +30 -0
  83. package/dist/rules/md024.d.ts.map +1 -0
  84. package/dist/rules/md024.js +123 -0
  85. package/dist/rules/md024.js.map +1 -0
  86. package/dist/rules/md025.d.ts +34 -0
  87. package/dist/rules/md025.d.ts.map +1 -0
  88. package/dist/rules/md025.js +134 -0
  89. package/dist/rules/md025.js.map +1 -0
  90. package/dist/rules/md026.d.ts +21 -0
  91. package/dist/rules/md026.d.ts.map +1 -0
  92. package/dist/rules/md026.js +31 -0
  93. package/dist/rules/md026.js.map +1 -0
  94. package/dist/rules/md027.d.ts +22 -0
  95. package/dist/rules/md027.d.ts.map +1 -0
  96. package/dist/rules/md027.js +27 -0
  97. package/dist/rules/md027.js.map +1 -0
  98. package/dist/rules/md028.d.ts +37 -0
  99. package/dist/rules/md028.d.ts.map +1 -0
  100. package/dist/rules/md028.js +84 -0
  101. package/dist/rules/md028.js.map +1 -0
  102. package/dist/rules/md029.d.ts +30 -0
  103. package/dist/rules/md029.d.ts.map +1 -0
  104. package/dist/rules/md029.js +36 -0
  105. package/dist/rules/md029.js.map +1 -0
  106. package/dist/rules/md030.d.ts +28 -0
  107. package/dist/rules/md030.d.ts.map +1 -0
  108. package/dist/rules/md030.js +76 -0
  109. package/dist/rules/md030.js.map +1 -0
  110. package/dist/rules/md031.d.ts +22 -0
  111. package/dist/rules/md031.d.ts.map +1 -0
  112. package/dist/rules/md031.js +55 -0
  113. package/dist/rules/md031.js.map +1 -0
  114. package/dist/rules/md032.d.ts +21 -0
  115. package/dist/rules/md032.d.ts.map +1 -0
  116. package/dist/rules/md032.js +69 -0
  117. package/dist/rules/md032.js.map +1 -0
  118. package/dist/rules/md033.d.ts +28 -0
  119. package/dist/rules/md033.d.ts.map +1 -0
  120. package/dist/rules/md033.js +34 -0
  121. package/dist/rules/md033.js.map +1 -0
  122. package/dist/rules/md034.d.ts +28 -0
  123. package/dist/rules/md034.d.ts.map +1 -0
  124. package/dist/rules/md034.js +100 -0
  125. package/dist/rules/md034.js.map +1 -0
  126. package/dist/rules/md035.d.ts +23 -0
  127. package/dist/rules/md035.d.ts.map +1 -0
  128. package/dist/rules/md035.js +52 -0
  129. package/dist/rules/md035.js.map +1 -0
  130. package/dist/rules/md036.d.ts +34 -0
  131. package/dist/rules/md036.d.ts.map +1 -0
  132. package/dist/rules/md036.js +112 -0
  133. package/dist/rules/md036.js.map +1 -0
  134. package/dist/rules/md037.d.ts +28 -0
  135. package/dist/rules/md037.d.ts.map +1 -0
  136. package/dist/rules/md037.js +122 -0
  137. package/dist/rules/md037.js.map +1 -0
  138. package/dist/rules/md038.d.ts +28 -0
  139. package/dist/rules/md038.d.ts.map +1 -0
  140. package/dist/rules/md038.js +62 -0
  141. package/dist/rules/md038.js.map +1 -0
  142. package/dist/rules/md039.d.ts +21 -0
  143. package/dist/rules/md039.d.ts.map +1 -0
  144. package/dist/rules/md039.js +34 -0
  145. package/dist/rules/md039.js.map +1 -0
  146. package/dist/rules/md040.d.ts +21 -0
  147. package/dist/rules/md040.d.ts.map +1 -0
  148. package/dist/rules/md040.js +46 -0
  149. package/dist/rules/md040.js.map +1 -0
  150. package/dist/rules/md041.d.ts +33 -0
  151. package/dist/rules/md041.d.ts.map +1 -0
  152. package/dist/rules/md041.js +92 -0
  153. package/dist/rules/md041.js.map +1 -0
  154. package/dist/rules/md042.d.ts +22 -0
  155. package/dist/rules/md042.d.ts.map +1 -0
  156. package/dist/rules/md042.js +50 -0
  157. package/dist/rules/md042.js.map +1 -0
  158. package/dist/rules/md043.d.ts +39 -0
  159. package/dist/rules/md043.d.ts.map +1 -0
  160. package/dist/rules/md043.js +116 -0
  161. package/dist/rules/md043.js.map +1 -0
  162. package/dist/rules/md044.d.ts +40 -0
  163. package/dist/rules/md044.d.ts.map +1 -0
  164. package/dist/rules/md044.js +167 -0
  165. package/dist/rules/md044.js.map +1 -0
  166. package/dist/rules/md045.d.ts +22 -0
  167. package/dist/rules/md045.d.ts.map +1 -0
  168. package/dist/rules/md045.js +57 -0
  169. package/dist/rules/md045.js.map +1 -0
  170. package/dist/rules/md046.d.ts +23 -0
  171. package/dist/rules/md046.d.ts.map +1 -0
  172. package/dist/rules/md046.js +174 -0
  173. package/dist/rules/md046.js.map +1 -0
  174. package/dist/rules/md047.d.ts +22 -0
  175. package/dist/rules/md047.d.ts.map +1 -0
  176. package/dist/rules/md047.js +35 -0
  177. package/dist/rules/md047.js.map +1 -0
  178. package/dist/rules/md048.d.ts +22 -0
  179. package/dist/rules/md048.d.ts.map +1 -0
  180. package/dist/rules/md048.js +80 -0
  181. package/dist/rules/md048.js.map +1 -0
  182. package/dist/rules/md049.d.ts +33 -0
  183. package/dist/rules/md049.d.ts.map +1 -0
  184. package/dist/rules/md049.js +189 -0
  185. package/dist/rules/md049.js.map +1 -0
  186. package/dist/rules/md050.d.ts +22 -0
  187. package/dist/rules/md050.d.ts.map +1 -0
  188. package/dist/rules/md050.js +32 -0
  189. package/dist/rules/md050.js.map +1 -0
  190. package/dist/rules/md051.d.ts +23 -0
  191. package/dist/rules/md051.d.ts.map +1 -0
  192. package/dist/rules/md051.js +63 -0
  193. package/dist/rules/md051.js.map +1 -0
  194. package/dist/rules/md052.d.ts +21 -0
  195. package/dist/rules/md052.d.ts.map +1 -0
  196. package/dist/rules/md052.js +71 -0
  197. package/dist/rules/md052.js.map +1 -0
  198. package/dist/rules/md053.d.ts +21 -0
  199. package/dist/rules/md053.d.ts.map +1 -0
  200. package/dist/rules/md053.js +95 -0
  201. package/dist/rules/md053.js.map +1 -0
  202. package/dist/rules/md054.d.ts +21 -0
  203. package/dist/rules/md054.d.ts.map +1 -0
  204. package/dist/rules/md054.js +87 -0
  205. package/dist/rules/md054.js.map +1 -0
  206. package/dist/rules/md055.d.ts +22 -0
  207. package/dist/rules/md055.d.ts.map +1 -0
  208. package/dist/rules/md055.js +157 -0
  209. package/dist/rules/md055.js.map +1 -0
  210. package/dist/rules/md056.d.ts +21 -0
  211. package/dist/rules/md056.d.ts.map +1 -0
  212. package/dist/rules/md056.js +154 -0
  213. package/dist/rules/md056.js.map +1 -0
  214. package/dist/rules/md058.d.ts +27 -0
  215. package/dist/rules/md058.d.ts.map +1 -0
  216. package/dist/rules/md058.js +71 -0
  217. package/dist/rules/md058.js.map +1 -0
  218. package/dist/rules/md059.d.ts +22 -0
  219. package/dist/rules/md059.d.ts.map +1 -0
  220. package/dist/rules/md059.js +161 -0
  221. package/dist/rules/md059.js.map +1 -0
  222. package/dist/rules/rule-interface.d.ts +51 -0
  223. package/dist/rules/rule-interface.d.ts.map +1 -0
  224. package/dist/rules/rule-interface.js +2 -0
  225. package/dist/rules/rule-interface.js.map +1 -0
  226. package/dist/server.d.ts +59 -0
  227. package/dist/server.d.ts.map +1 -0
  228. package/dist/server.js +419 -0
  229. package/dist/server.js.map +1 -0
  230. package/dist/types.d.ts +74 -0
  231. package/dist/types.d.ts.map +1 -0
  232. package/dist/types.js +14 -0
  233. package/dist/types.js.map +1 -0
  234. package/dist/utils/file.d.ts +39 -0
  235. package/dist/utils/file.d.ts.map +1 -0
  236. package/dist/utils/file.js +124 -0
  237. package/dist/utils/file.js.map +1 -0
  238. package/dist/utils/logger.d.ts +61 -0
  239. package/dist/utils/logger.d.ts.map +1 -0
  240. package/dist/utils/logger.js +85 -0
  241. package/dist/utils/logger.js.map +1 -0
  242. package/dist/utils/safe-match.d.ts +4 -0
  243. package/dist/utils/safe-match.d.ts.map +1 -0
  244. package/dist/utils/safe-match.js +51 -0
  245. package/dist/utils/safe-match.js.map +1 -0
  246. package/package.json +85 -0
package/dist/server.js ADDED
@@ -0,0 +1,419 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
4
+ // Lazy-load `markdownlint` inside methods to avoid ESM import issues during tests
5
+ import path from 'path';
6
+ import { applyRuleFixes, getImplementedRules } from './rules/index';
7
+ import { contentToLines, linesToContent, loadConfiguration, readFile, writeFile, } from './utils/file';
8
+ import logger from './utils/logger';
9
+ /**
10
+ * MCP server for markdownlint functionality
11
+ * Provides tools for linting and fixing markdown files
12
+ */
13
+ export class MarkdownLintServer {
14
+ server;
15
+ /**
16
+ * Initialize the markdownlint MCP server
17
+ */
18
+ constructor() {
19
+ this.server = new Server({
20
+ name: 'markdownlint-mcp',
21
+ version: '1.0.0',
22
+ }, {
23
+ capabilities: {
24
+ tools: {},
25
+ },
26
+ });
27
+ this.setupToolHandlers();
28
+ // Error handling
29
+ this.server.onerror = error => logger.error('MCP Error', error);
30
+ process.on('SIGINT', async () => {
31
+ await this.server.close();
32
+ process.exit(0);
33
+ });
34
+ }
35
+ /**
36
+ * Set up handlers for MCP tool requests
37
+ */
38
+ setupToolHandlers() {
39
+ // List available tools
40
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
41
+ return {
42
+ tools: [
43
+ {
44
+ name: 'lint_markdown',
45
+ description: 'Analyze a Markdown file and return detailed linting issues',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ filePath: {
50
+ type: 'string',
51
+ description: 'Path to the Markdown file to lint',
52
+ },
53
+ },
54
+ required: ['filePath'],
55
+ },
56
+ },
57
+ {
58
+ name: 'fix_markdown',
59
+ description: 'Automatically fix ALL possible Markdown issues and return the corrected content',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ filePath: {
64
+ type: 'string',
65
+ description: 'Path to the Markdown file to fix',
66
+ },
67
+ writeFile: {
68
+ type: 'boolean',
69
+ description: 'Whether to write the fixed content back to the file (default: true)',
70
+ default: true,
71
+ },
72
+ },
73
+ required: ['filePath'],
74
+ },
75
+ },
76
+ {
77
+ name: 'get_configuration',
78
+ description: 'Display current markdownlint rules and configuration',
79
+ inputSchema: {
80
+ type: 'object',
81
+ properties: {},
82
+ additionalProperties: false,
83
+ },
84
+ },
85
+ ],
86
+ };
87
+ });
88
+ // Handle tool calls
89
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
90
+ const { name, arguments: args } = request.params;
91
+ try {
92
+ // Type guard for arguments
93
+ if (!args || typeof args !== 'object') {
94
+ throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments provided');
95
+ }
96
+ const typedArgs = args;
97
+ switch (name) {
98
+ case 'lint_markdown':
99
+ if (typeof typedArgs.filePath !== 'string') {
100
+ throw new McpError(ErrorCode.InvalidParams, 'filePath must be a string');
101
+ }
102
+ return await this.lintMarkdown(typedArgs.filePath);
103
+ case 'fix_markdown':
104
+ if (typeof typedArgs.filePath !== 'string') {
105
+ throw new McpError(ErrorCode.InvalidParams, 'filePath must be a string');
106
+ }
107
+ const writeFile = typeof typedArgs.writeFile === 'boolean' ? typedArgs.writeFile : true;
108
+ return await this.fixMarkdown(typedArgs.filePath, writeFile);
109
+ case 'get_configuration':
110
+ return await this.getConfiguration();
111
+ default:
112
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
113
+ }
114
+ }
115
+ catch (error) {
116
+ if (error instanceof McpError) {
117
+ throw error;
118
+ }
119
+ throw new McpError(ErrorCode.InternalError, `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`);
120
+ }
121
+ });
122
+ }
123
+ /**
124
+ * Lint a markdown file and report issues
125
+ * @param filePath Path to the markdown file
126
+ * @returns MCP content response with linting results
127
+ */
128
+ async lintMarkdown(filePath) {
129
+ try {
130
+ logger.debug(`Linting markdown file: ${filePath}`);
131
+ // Read file content
132
+ const content = await readFile(filePath);
133
+ // Load configuration (check for .markdownlint.json in file directory or use defaults)
134
+ const config = await loadConfiguration(path.dirname(filePath));
135
+ // Run markdownlint (lazy import to avoid loading ESM into Jest process)
136
+ const md = await import('markdownlint');
137
+ const markdownlintLocal = md.default ?? md;
138
+ const results = markdownlintLocal.sync({
139
+ strings: {
140
+ [filePath]: content,
141
+ },
142
+ config,
143
+ });
144
+ const lintResults = (results[filePath] || []);
145
+ const issues = lintResults.map(r => {
146
+ const rawFix = r
147
+ .fixInfo;
148
+ const fixInfo = (() => {
149
+ if (rawFix && typeof rawFix === 'object') {
150
+ const candidate = rawFix;
151
+ return {
152
+ editColumn: typeof candidate.editColumn === 'number' ? candidate.editColumn : undefined,
153
+ deleteCount: typeof candidate.deleteCount === 'number' ? candidate.deleteCount : undefined,
154
+ insertText: typeof candidate.insertText === 'string' ? candidate.insertText : undefined,
155
+ };
156
+ }
157
+ return undefined;
158
+ })();
159
+ return {
160
+ lineNumber: r.lineNumber,
161
+ ruleNames: r.ruleNames,
162
+ ruleDescription: r.ruleNames && r.ruleNames.length > 0 ? r.ruleNames.join('/') : 'Unknown rule',
163
+ errorDetail: r
164
+ .errorDetail,
165
+ fixInfo,
166
+ };
167
+ });
168
+ logger.info(`Found ${issues.length} issues in ${filePath}`);
169
+ if (issues.length === 0) {
170
+ return {
171
+ content: [
172
+ {
173
+ type: 'text',
174
+ text: `✅ **${path.basename(filePath)}** - No linting issues found!\n\nThe file is compliant with Markdown standards.`,
175
+ },
176
+ ],
177
+ };
178
+ }
179
+ // Format issues for display
180
+ const issueList = issues
181
+ .map((issue) => `- **Line ${issue.lineNumber}**: ${issue.ruleDescription} (${issue.ruleNames.join('/')})\n ${issue.errorDetail || ''}`)
182
+ .join('\n');
183
+ const fixableCount = issues.filter(issue => issue.fixInfo).length;
184
+ const fixableText = fixableCount > 0
185
+ ? `\n\n💡 **${fixableCount} of these issues can be automatically fixed** using the \`fix_markdown\` tool.`
186
+ : '';
187
+ return {
188
+ content: [
189
+ {
190
+ type: 'text',
191
+ text: `## Markdown Linting Results for ${path.basename(filePath)}\n\n**Found ${issues.length} issue(s):**\n\n${issueList}${fixableText}`,
192
+ },
193
+ ],
194
+ };
195
+ }
196
+ catch (error) {
197
+ logger.error(`Error linting markdown file: ${filePath}`, error);
198
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
199
+ throw new McpError(ErrorCode.InvalidParams, `File not found: ${filePath}`);
200
+ }
201
+ throw error;
202
+ }
203
+ }
204
+ /**
205
+ * Fix markdown issues in a file
206
+ * @param filePath Path to the markdown file
207
+ * @param writeToFile Whether to write fixes back to the file
208
+ * @returns MCP content response with fix results
209
+ */
210
+ async fixMarkdown(filePath, writeToFile) {
211
+ try {
212
+ logger.debug(`Fixing markdown file: ${filePath}, writeToFile: ${writeToFile}`);
213
+ // Read file content
214
+ const originalContent = await readFile(filePath);
215
+ // Load configuration
216
+ const config = await loadConfiguration(path.dirname(filePath));
217
+ // Get initial issues count (lazy import)
218
+ const mdInit = await import('markdownlint');
219
+ const markdownlintInit = mdInit.default ??
220
+ mdInit;
221
+ const initialResults = markdownlintInit.sync({
222
+ strings: {
223
+ [filePath]: originalContent,
224
+ },
225
+ config,
226
+ });
227
+ const initialLintResults = (initialResults[filePath] ||
228
+ []);
229
+ const initialIssues = initialLintResults.map(r => {
230
+ const rawFix = r
231
+ .fixInfo;
232
+ const fixInfo = (() => {
233
+ if (rawFix && typeof rawFix === 'object') {
234
+ const candidate = rawFix;
235
+ return {
236
+ editColumn: typeof candidate.editColumn === 'number' ? candidate.editColumn : undefined,
237
+ deleteCount: typeof candidate.deleteCount === 'number' ? candidate.deleteCount : undefined,
238
+ insertText: typeof candidate.insertText === 'string' ? candidate.insertText : undefined,
239
+ };
240
+ }
241
+ return undefined;
242
+ })();
243
+ return {
244
+ lineNumber: r.lineNumber,
245
+ ruleNames: r.ruleNames,
246
+ ruleDescription: r.ruleNames && r.ruleNames.length > 0 ? r.ruleNames.join('/') : 'Unknown rule',
247
+ errorDetail: r
248
+ .errorDetail,
249
+ fixInfo,
250
+ };
251
+ });
252
+ logger.info(`Initial issues count: ${initialIssues.length}`);
253
+ // Split content into lines
254
+ let lines = contentToLines(originalContent);
255
+ let fixesApplied = 0;
256
+ // Get rule names from the issues to apply fixes
257
+ const ruleNames = initialIssues
258
+ .map(issue => issue.ruleNames[0])
259
+ .filter((value, index, self) => self.indexOf(value) === index); // Unique rule names
260
+ logger.debug(`Applying fixes for rules: ${ruleNames.join(', ')}`);
261
+ // Apply our custom rule fixes
262
+ const implementedRuleNames = getImplementedRules();
263
+ const rulesToApply = ruleNames.filter(rule => implementedRuleNames.includes(rule));
264
+ if (rulesToApply.length > 0) {
265
+ const originalLineCount = lines.length;
266
+ lines = applyRuleFixes(lines, rulesToApply);
267
+ // Calculate rough number of fixes applied
268
+ fixesApplied += lines.length - originalLineCount;
269
+ logger.debug(`Applied custom fixes: ${fixesApplied}`);
270
+ }
271
+ // Combine lines back into content
272
+ const currentContent = linesToContent(lines);
273
+ // If content has changed, consider the fixes applied
274
+ if (currentContent !== originalContent) {
275
+ fixesApplied = fixesApplied > 0 ? fixesApplied : 1;
276
+ }
277
+ // Apply markdownlint's built-in fixes if available
278
+ if (fixesApplied === 0) {
279
+ try {
280
+ // Try markdownlint's built-in fix as a fallback
281
+ const mdFix = await import('markdownlint');
282
+ const markdownlintFix = mdFix.default ??
283
+ mdFix;
284
+ const fixResults = markdownlintFix.sync({
285
+ strings: {
286
+ [filePath]: originalContent,
287
+ },
288
+ config,
289
+ fix: true,
290
+ });
291
+ // Avoid indexing by user-provided keys; use first available result
292
+ const firstResult = Object.values(fixResults)[0];
293
+ const fixedContent = firstResult?.[0]?.fixedContent;
294
+ if (fixedContent && fixedContent !== originalContent) {
295
+ lines = contentToLines(fixedContent);
296
+ fixesApplied += 1; // Count one fix per rule applied
297
+ logger.debug('Applied built-in markdownlint fixes');
298
+ }
299
+ }
300
+ catch (err) {
301
+ logger.error('Error in fallback fix attempt:', err);
302
+ }
303
+ }
304
+ // Write the fixed content back to file if requested
305
+ if (writeToFile && fixesApplied > 0) {
306
+ await writeFile(filePath, currentContent);
307
+ logger.info(`Wrote fixed content to ${filePath}`);
308
+ }
309
+ // Get final results
310
+ const mdFinal = await import('markdownlint');
311
+ const markdownlintFinal = mdFinal.default ??
312
+ mdFinal;
313
+ const finalResults = markdownlintFinal.sync({
314
+ strings: {
315
+ [filePath]: currentContent,
316
+ },
317
+ config,
318
+ });
319
+ const finalLintResults = (finalResults[filePath] ||
320
+ []);
321
+ const finalIssues = finalLintResults.map(r => {
322
+ const rawFix = r
323
+ .fixInfo;
324
+ const fixInfo = (() => {
325
+ if (rawFix && typeof rawFix === 'object') {
326
+ const candidate = rawFix;
327
+ return {
328
+ editColumn: typeof candidate.editColumn === 'number' ? candidate.editColumn : undefined,
329
+ deleteCount: typeof candidate.deleteCount === 'number' ? candidate.deleteCount : undefined,
330
+ insertText: typeof candidate.insertText === 'string' ? candidate.insertText : undefined,
331
+ };
332
+ }
333
+ return undefined;
334
+ })();
335
+ return {
336
+ lineNumber: r.lineNumber,
337
+ ruleNames: r.ruleNames,
338
+ ruleDescription: r.ruleNames && r.ruleNames.length > 0 ? r.ruleNames.join('/') : 'Unknown rule',
339
+ errorDetail: r
340
+ .errorDetail,
341
+ fixInfo,
342
+ };
343
+ });
344
+ logger.info(`Final issues count: ${finalIssues.length}`);
345
+ // Generate status report
346
+ let statusText = '';
347
+ if (fixesApplied > 0) {
348
+ statusText = `✅ **Successfully fixed ${fixesApplied} issue(s)**\n\n`;
349
+ }
350
+ if (finalIssues.length > 0) {
351
+ statusText += `⚠️ **${finalIssues.length} issue(s) require manual attention:**\n\n`;
352
+ const remainingList = finalIssues
353
+ .map((issue) => `- **Line ${issue.lineNumber}**: ${issue.ruleDescription} (${issue.ruleNames.join('/')})\n ${issue.errorDetail || ''}`)
354
+ .join('\n');
355
+ statusText += remainingList;
356
+ }
357
+ else if (fixesApplied > 0) {
358
+ statusText += `🎉 **All issues resolved!** The file is now fully compliant with Markdown standards.`;
359
+ }
360
+ else {
361
+ statusText = `✅ **No fixes needed** - The file is already compliant.`;
362
+ }
363
+ if (writeToFile && fixesApplied > 0) {
364
+ statusText += `\n\n📝 **Changes saved to file**`;
365
+ }
366
+ // Add summary
367
+ statusText += `\n\n**Summary:**\n- **Before:** ${initialIssues.length} issues\n- **After:** ${finalIssues.length} issues\n- **Fixed:** ${fixesApplied} issues`;
368
+ return {
369
+ content: [
370
+ {
371
+ type: 'text',
372
+ text: `## Fix Results for ${path.basename(filePath)}\n\n${statusText}${!writeToFile && fixesApplied > 0 ? '\n\n**Preview of fixed content:**\n\n```markdown\n' + currentContent + '\n```' : ''}`,
373
+ },
374
+ ],
375
+ };
376
+ }
377
+ catch (error) {
378
+ logger.error(`Error fixing markdown file: ${filePath}`, error);
379
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
380
+ throw new McpError(ErrorCode.InvalidParams, `File not found: ${filePath}`);
381
+ }
382
+ throw error;
383
+ }
384
+ }
385
+ /**
386
+ * Get the current markdownlint configuration
387
+ * @returns MCP content response with configuration details
388
+ */
389
+ async getConfiguration() {
390
+ logger.debug('Getting markdownlint configuration');
391
+ const implementedRules = getImplementedRules();
392
+ return {
393
+ content: [
394
+ {
395
+ type: 'text',
396
+ text: `## Current Markdownlint Configuration\n\n**Active Rules:**\n- Line length limit: 120 characters\n- HTML elements: Allowed\n- First line heading: Not required\n- All other rules: Enabled (default markdownlint ruleset)\n\n**Configuration Source:** Built-in defaults (can be overridden with .markdownlint.json)\n\n**Total Rules:** 30+ standard markdownlint rules covering formatting, consistency, and best practices.\n\n**Auto-Fix Capability:** Automatically fixes ${implementedRules.length} rule violations including ${implementedRules.join(', ')}.`,
397
+ },
398
+ ],
399
+ };
400
+ }
401
+ /**
402
+ * Start the MCP server
403
+ */
404
+ async run() {
405
+ logger.info('Starting markdownlint MCP server');
406
+ const transport = new StdioServerTransport();
407
+ await this.server.connect(transport);
408
+ logger.info('Markdownlint MCP server running on stdio');
409
+ }
410
+ }
411
+ /**
412
+ * Create and return a new MarkdownLint server instance
413
+ * @returns A new MarkdownLintServer instance
414
+ */
415
+ export function createServer() {
416
+ return new MarkdownLintServer();
417
+ }
418
+ export default MarkdownLintServer;
419
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * markdownlint-mcp type definitions
3
+ */
4
+ /**
5
+ * Interface for markdownlint issue object
6
+ */
7
+ export interface MarkdownlintIssue {
8
+ /**
9
+ * Line number where the issue was found
10
+ */
11
+ lineNumber: number;
12
+ /**
13
+ * Array of rule names that were violated
14
+ */
15
+ ruleNames: string[];
16
+ /**
17
+ * Human-readable description of the rule
18
+ */
19
+ ruleDescription: string;
20
+ /**
21
+ * Additional details about the error (optional)
22
+ */
23
+ errorDetail?: string;
24
+ /**
25
+ * Information for automatic fixing (optional)
26
+ */
27
+ fixInfo?: {
28
+ /**
29
+ * Column where the edit should start
30
+ */
31
+ editColumn?: number;
32
+ /**
33
+ * Number of characters to delete
34
+ */
35
+ deleteCount?: number;
36
+ /**
37
+ * Text to insert at the edit position
38
+ */
39
+ insertText?: string;
40
+ };
41
+ }
42
+ /**
43
+ * Interface for tool argument objects
44
+ */
45
+ export interface ToolArguments {
46
+ /**
47
+ * Path to the markdown file
48
+ */
49
+ filePath?: unknown;
50
+ /**
51
+ * Whether to write fixes back to the file
52
+ */
53
+ writeFile?: unknown;
54
+ }
55
+ /**
56
+ * Interface for markdownlint configuration
57
+ */
58
+ export interface MarkdownlintConfig {
59
+ /**
60
+ * Default configuration flag (enables all rules)
61
+ */
62
+ default?: boolean;
63
+ /**
64
+ * Individual rule configurations
65
+ * Keys are rule identifiers like 'MD013'
66
+ */
67
+ [key: string]: unknown;
68
+ }
69
+ /**
70
+ * Default markdownlint configuration
71
+ * Used when no custom configuration is provided
72
+ */
73
+ export declare const DEFAULT_CONFIG: MarkdownlintConfig;
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE;QACR;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QAErB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,kBAK5B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * markdownlint-mcp type definitions
3
+ */
4
+ /**
5
+ * Default markdownlint configuration
6
+ * Used when no custom configuration is provided
7
+ */
8
+ export const DEFAULT_CONFIG = {
9
+ default: true,
10
+ MD013: { line_length: 120 }, // Allow longer lines for modern displays
11
+ MD033: false, // Allow HTML
12
+ MD041: false, // Allow files to not start with H1
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,yCAAyC;IACtE,KAAK,EAAE,KAAK,EAAE,aAAa;IAC3B,KAAK,EAAE,KAAK,EAAE,mCAAmC;CAClD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { MarkdownlintConfig } from '../types.js';
2
+ /**
3
+ * Read a file's content
4
+ * @param filePath Path to the file
5
+ * @returns File content as a string
6
+ * @throws Error if file cannot be read
7
+ */
8
+ export declare function readFile(filePath: string): Promise<string>;
9
+ /**
10
+ * Write content to a file
11
+ * @param filePath Path to the file
12
+ * @param content Content to write
13
+ * @throws Error if file cannot be written
14
+ */
15
+ export declare function writeFile(filePath: string, content: string): Promise<void>;
16
+ /**
17
+ * Load markdownlint configuration from file or use defaults
18
+ * @param directory Directory to look for .markdownlint.json
19
+ * @returns Configuration object
20
+ */
21
+ export declare function loadConfiguration(directory: string): Promise<MarkdownlintConfig>;
22
+ /**
23
+ * Get the default markdownlint configuration
24
+ * @returns Default configuration object
25
+ */
26
+ export declare function getDefaultConfig(): MarkdownlintConfig;
27
+ /**
28
+ * Convert string content to an array of lines
29
+ * @param content String content to split into lines
30
+ * @returns Array of lines
31
+ */
32
+ export declare function contentToLines(content: string): string[];
33
+ /**
34
+ * Join an array of lines into a single string
35
+ * @param lines Array of lines to join
36
+ * @returns Joined string
37
+ */
38
+ export declare function linesToContent(lines: string[]): string;
39
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAajD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBhE;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqDtF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD"}