@ankimcp/anki-mcp-server 0.8.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.
- package/LICENSE +7 -0
- package/README.md +756 -0
- package/bin/ankimcp.js +12 -0
- package/dist/anki-config.service.d.ts +10 -0
- package/dist/anki-config.service.js +42 -0
- package/dist/anki-config.service.js.map +1 -0
- package/dist/app.module.d.ts +5 -0
- package/dist/app.module.js +84 -0
- package/dist/app.module.js.map +1 -0
- package/dist/bootstrap.d.ts +3 -0
- package/dist/bootstrap.js +39 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +114 -0
- package/dist/cli.js.map +1 -0
- package/dist/http/guards/origin-validation.guard.d.ts +7 -0
- package/dist/http/guards/origin-validation.guard.js +52 -0
- package/dist/http/guards/origin-validation.guard.js.map +1 -0
- package/dist/main-http.d.ts +1 -0
- package/dist/main-http.js +42 -0
- package/dist/main-http.js.map +1 -0
- package/dist/main-stdio.d.ts +1 -0
- package/dist/main-stdio.js +20 -0
- package/dist/main-stdio.js.map +1 -0
- package/dist/mcp/clients/__mocks__/anki-connect.client.d.ts +6 -0
- package/dist/mcp/clients/__mocks__/anki-connect.client.js +18 -0
- package/dist/mcp/clients/__mocks__/anki-connect.client.js.map +1 -0
- package/dist/mcp/clients/anki-connect.client.d.ts +15 -0
- package/dist/mcp/clients/anki-connect.client.js +145 -0
- package/dist/mcp/clients/anki-connect.client.js.map +1 -0
- package/dist/mcp/config/anki-config.interface.d.ts +7 -0
- package/dist/mcp/config/anki-config.interface.js +5 -0
- package/dist/mcp/config/anki-config.interface.js.map +1 -0
- package/dist/mcp/primitives/essential/index.d.ts +32 -0
- package/dist/mcp/primitives/essential/index.js +130 -0
- package/dist/mcp/primitives/essential/index.js.map +1 -0
- package/dist/mcp/primitives/essential/prompts/review-session.prompt.d.ts +12 -0
- package/dist/mcp/primitives/essential/prompts/review-session.prompt.js +113 -0
- package/dist/mcp/primitives/essential/prompts/review-session.prompt.js.map +1 -0
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/content.md +195 -0
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/index.d.ts +12 -0
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/index.js +89 -0
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/index.js.map +1 -0
- package/dist/mcp/primitives/essential/resources/system-info.resource.d.ts +21 -0
- package/dist/mcp/primitives/essential/resources/system-info.resource.js +115 -0
- package/dist/mcp/primitives/essential/resources/system-info.resource.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +93 -0
- package/dist/mcp/primitives/essential/tools/add-note.tool.js +185 -0
- package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js +121 -0
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/create-model.tool.d.ts +88 -0
- package/dist/mcp/primitives/essential/tools/create-model.tool.js +144 -0
- package/dist/mcp/primitives/essential/tools/create-model.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.d.ts +84 -0
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.js +120 -0
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/find-notes.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/find-notes.tool.js +106 -0
- package/dist/mcp/primitives/essential/tools/find-notes.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.d.ts +84 -0
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js +108 -0
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js +117 -0
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.d.ts +10 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js +18 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js +22 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js +29 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.d.ts +15 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js +41 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.d.ts +5 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.js +6 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.d.ts +89 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js +141 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.js +119 -0
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/model-names.tool.d.ts +81 -0
- package/dist/mcp/primitives/essential/tools/model-names.tool.js +80 -0
- package/dist/mcp/primitives/essential/tools/model-names.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/model-styling.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/model-styling.tool.js +93 -0
- package/dist/mcp/primitives/essential/tools/model-styling.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/notes-info.tool.d.ts +83 -0
- package/dist/mcp/primitives/essential/tools/notes-info.tool.js +111 -0
- package/dist/mcp/primitives/essential/tools/notes-info.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/present-card.tool.d.ts +84 -0
- package/dist/mcp/primitives/essential/tools/present-card.tool.js +100 -0
- package/dist/mcp/primitives/essential/tools/present-card.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/rate-card.tool.d.ts +84 -0
- package/dist/mcp/primitives/essential/tools/rate-card.tool.js +101 -0
- package/dist/mcp/primitives/essential/tools/rate-card.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/sync.tool.d.ts +81 -0
- package/dist/mcp/primitives/essential/tools/sync.tool.js +61 -0
- package/dist/mcp/primitives/essential/tools/sync.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.d.ts +84 -0
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js +119 -0
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.d.ts +96 -0
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js +154 -0
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/index.d.ts +23 -0
- package/dist/mcp/primitives/gui/index.js +94 -0
- package/dist/mcp/primitives/gui/index.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.d.ts +88 -0
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js +111 -0
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.d.ts +87 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js +99 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js +76 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js +64 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js +88 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js +80 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js +90 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js +83 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js.map +1 -0
- package/dist/mcp/types/anki.types.d.ts +180 -0
- package/dist/mcp/types/anki.types.js +18 -0
- package/dist/mcp/types/anki.types.js.map +1 -0
- package/dist/mcp/utils/anki.utils.d.ts +19 -0
- package/dist/mcp/utils/anki.utils.js +157 -0
- package/dist/mcp/utils/anki.utils.js.map +1 -0
- package/dist/mcp/utils/markdown.utils.d.ts +4 -0
- package/dist/mcp/utils/markdown.utils.js +60 -0
- package/dist/mcp/utils/markdown.utils.js.map +1 -0
- package/dist/mcp/utils/mcpb-workarounds.d.ts +1 -0
- package/dist/mcp/utils/mcpb-workarounds.js +13 -0
- package/dist/mcp/utils/mcpb-workarounds.js.map +1 -0
- package/dist/services/ngrok.service.d.ts +15 -0
- package/dist/services/ngrok.service.js +120 -0
- package/dist/services/ngrok.service.js.map +1 -0
- package/dist/test-fixtures/mock-data.d.ts +126 -0
- package/dist/test-fixtures/mock-data.js +112 -0
- package/dist/test-fixtures/mock-data.js.map +1 -0
- package/dist/test-fixtures/test-helpers.d.ts +12 -0
- package/dist/test-fixtures/test-helpers.js +24 -0
- package/dist/test-fixtures/test-helpers.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +168 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Description
|
|
2
|
+
|
|
3
|
+
Twenty rules of formulating knowledge for effective Anki flashcard creation based on Dr. Piotr Wozniak's SuperMemo research
|
|
4
|
+
|
|
5
|
+
# Content
|
|
6
|
+
|
|
7
|
+
*Based on "Twenty Rules of Formulating Knowledge" by Dr. Piotr Wozniak: https://www.supermemo.com/en/blog/twenty-rules-of-formulating-knowledge*
|
|
8
|
+
|
|
9
|
+
You are helping a user create effective Anki flashcards based on Dr. Piotr Wozniak's "Twenty Rules of Formulating Knowledge" from SuperMemo research. These principles dramatically improve retention and reduce study time.
|
|
10
|
+
|
|
11
|
+
## Core Principles
|
|
12
|
+
|
|
13
|
+
### 1. Do Not Learn If You Do Not Understand
|
|
14
|
+
**Before creating any flashcard, ensure the user understands the concept.**
|
|
15
|
+
- Ask clarifying questions if the topic seems unclear
|
|
16
|
+
- Don't create cards from material the user hasn't comprehended
|
|
17
|
+
- Suggest breaking down complex topics into understandable chunks first
|
|
18
|
+
|
|
19
|
+
### 2. Learn Before You Memorize - Build the Big Picture First
|
|
20
|
+
**Context before details. Overview before memorization.**
|
|
21
|
+
- When user wants to learn a new topic, suggest understanding the overall structure first
|
|
22
|
+
- Example: Before creating cards about React hooks, ensure they understand React's component model
|
|
23
|
+
- Create foundational cards before advanced ones
|
|
24
|
+
|
|
25
|
+
### 3. Build Upon the Basics
|
|
26
|
+
**Never skip fundamentals. Simple before complex.**
|
|
27
|
+
- Identify prerequisite knowledge
|
|
28
|
+
- Suggest creating basic cards first, then build complexity
|
|
29
|
+
- Example: Learn addition before multiplication, HTTP before REST APIs
|
|
30
|
+
|
|
31
|
+
### 4. Stick to the Minimum Information Principle
|
|
32
|
+
**CRITICAL: Each card should test ONE piece of information.**
|
|
33
|
+
- ❌ BAD: "What are the three main features of React and how do they work?"
|
|
34
|
+
- ✅ GOOD: Three separate cards, each testing one feature
|
|
35
|
+
- Break complex cards into atomic units
|
|
36
|
+
- Simpler cards = faster reviews = better retention
|
|
37
|
+
|
|
38
|
+
### 5. Cloze Deletion is Easy and Effective
|
|
39
|
+
**Use fill-in-the-blank format extensively.**
|
|
40
|
+
- Convert statements into cloze deletions
|
|
41
|
+
- Example: "The capital of {{c1::France}} is {{c2::Paris}}"
|
|
42
|
+
- Particularly effective for facts, definitions, and relationships
|
|
43
|
+
- Multiple clozes per card are OK if they test the same context
|
|
44
|
+
|
|
45
|
+
### 6. Use Imagery - Visual Memory is Powerful
|
|
46
|
+
**Add images whenever possible.**
|
|
47
|
+
- "A picture is worth a thousand words"
|
|
48
|
+
- Suggest adding relevant images for:
|
|
49
|
+
- Geography, anatomy, architecture
|
|
50
|
+
- Historical figures, artworks
|
|
51
|
+
- Diagrams for abstract concepts
|
|
52
|
+
- Use the mediaActions tool to help users add images
|
|
53
|
+
|
|
54
|
+
### 7. Use Mnemonic Techniques
|
|
55
|
+
**Memory aids make retention easier.**
|
|
56
|
+
- Suggest mnemonics for difficult items
|
|
57
|
+
- Use acronyms (e.g., "PEMDAS" for math order of operations)
|
|
58
|
+
- Create vivid, memorable associations
|
|
59
|
+
- Link abstract concepts to concrete images
|
|
60
|
+
|
|
61
|
+
### 8. Avoid Sets - They're Difficult to Memorize
|
|
62
|
+
**Large lists are memory killers.**
|
|
63
|
+
- ❌ BAD: "List all 50 US state capitals"
|
|
64
|
+
- ✅ GOOD: Convert to cloze deletions or enumerated questions
|
|
65
|
+
- If a set is necessary, break it into overlapping subsets
|
|
66
|
+
- Use enumerations with context cues
|
|
67
|
+
|
|
68
|
+
### 9. Avoid Enumerations When Possible
|
|
69
|
+
**Lists are harder than single facts.**
|
|
70
|
+
- Instead of "What are the 7 principles of X?", create 7 separate cards
|
|
71
|
+
- If enumeration is necessary:
|
|
72
|
+
- Use cloze deletion: "The 7 principles are: {{c1::principle1}}, {{c2::principle2}}..."
|
|
73
|
+
- Add context and memory aids
|
|
74
|
+
- Keep lists short (max 5-7 items)
|
|
75
|
+
|
|
76
|
+
### 10. Combat Interference - Make Items Distinct
|
|
77
|
+
**Similar cards cause confusion.**
|
|
78
|
+
- Avoid creating nearly identical cards
|
|
79
|
+
- Make distinctions explicit
|
|
80
|
+
- Add context to differentiate similar concepts
|
|
81
|
+
- Example for similar countries:
|
|
82
|
+
- ❌ "Capital of Guyana?" and "Capital of Suriname?" (too similar)
|
|
83
|
+
- ✅ Add distinguishing features: "Capital of Guyana (only English-speaking country in South America)?"
|
|
84
|
+
|
|
85
|
+
### 11. Optimize Wording - Keep It Simple and Clear
|
|
86
|
+
**Shorter, simpler wording = faster reviews.**
|
|
87
|
+
- Remove unnecessary words
|
|
88
|
+
- Use active voice
|
|
89
|
+
- Make questions unambiguous
|
|
90
|
+
- ❌ "In the context of programming, when considering the various paradigms, what would you say is the main characteristic that defines the functional approach?"
|
|
91
|
+
- ✅ "Functional programming's main characteristic?"
|
|
92
|
+
|
|
93
|
+
### 12. Refer to Other Memories - Build Connections
|
|
94
|
+
**Connect new knowledge to existing knowledge.**
|
|
95
|
+
- Reference previously learned concepts
|
|
96
|
+
- Build knowledge networks
|
|
97
|
+
- Example: "Like REST but for GraphQL: {{c1::single endpoint}}"
|
|
98
|
+
- Use analogies to familiar concepts
|
|
99
|
+
|
|
100
|
+
### 13. Personalize and Provide Examples
|
|
101
|
+
**Personal context dramatically improves retention.**
|
|
102
|
+
- Link to user's experiences
|
|
103
|
+
- Use examples from their projects, life, or interests
|
|
104
|
+
- ❌ Generic: "TypeScript interface definition?"
|
|
105
|
+
- ✅ Personal: "TypeScript interface (like the User type in your project)?"
|
|
106
|
+
|
|
107
|
+
### 14. Rely on Emotional States
|
|
108
|
+
**Emotion enhances memory.**
|
|
109
|
+
- Use vivid, emotionally charged examples when appropriate
|
|
110
|
+
- Link to memorable events or stories
|
|
111
|
+
- Make boring facts interesting with context
|
|
112
|
+
- Example: Instead of dry historical dates, add dramatic context
|
|
113
|
+
|
|
114
|
+
### 15. Context Cues Simplify Wording
|
|
115
|
+
**Categories and prefixes reduce cognitive load.**
|
|
116
|
+
- Add subject prefixes: "bio:", "hist:", "prog:"
|
|
117
|
+
- Use tags effectively
|
|
118
|
+
- Group related cards in decks
|
|
119
|
+
- Example: "js: Array method for filtering?" (context cue: "js:")
|
|
120
|
+
|
|
121
|
+
### 16. Redundancy Can Be Beneficial
|
|
122
|
+
**Some repetition from different angles helps.**
|
|
123
|
+
- Create multiple cards for critical concepts from different angles
|
|
124
|
+
- Test the same fact in different contexts
|
|
125
|
+
- Balance with "don't overdo it"
|
|
126
|
+
|
|
127
|
+
### 17. Provide Sources and References
|
|
128
|
+
**Context helps understanding and future reference.**
|
|
129
|
+
- Add source information in card metadata or extra field
|
|
130
|
+
- Link to documentation, books, or articles
|
|
131
|
+
- Helps when reviewing old cards
|
|
132
|
+
|
|
133
|
+
### 18. Prioritize - Learn What Matters Most
|
|
134
|
+
**Not everything deserves a flashcard.**
|
|
135
|
+
- Focus on applicable, useful knowledge
|
|
136
|
+
- Ask: "Will I actually need to recall this?"
|
|
137
|
+
- Quality over quantity
|
|
138
|
+
|
|
139
|
+
## Workflow for Creating Cards
|
|
140
|
+
|
|
141
|
+
1. **Understand First**: Verify user understands the concept
|
|
142
|
+
2. **Build Context**: Ensure foundational knowledge exists
|
|
143
|
+
3. **Apply Minimum Information**: Break into atomic facts
|
|
144
|
+
4. **Choose Format**: Prefer cloze deletion for facts, Q&A for concepts
|
|
145
|
+
5. **Optimize Wording**: Make it clear, concise, unambiguous
|
|
146
|
+
6. **Add Richness**: Images, mnemonics, personal connections
|
|
147
|
+
7. **Review**: Check for interference with existing cards
|
|
148
|
+
|
|
149
|
+
## When User Asks to Create Cards
|
|
150
|
+
|
|
151
|
+
1. Ask about their understanding of the topic
|
|
152
|
+
2. Suggest the number and type of cards (don't just create them)
|
|
153
|
+
3. Show examples of proposed cards
|
|
154
|
+
4. Wait for approval before creating
|
|
155
|
+
5. Apply these rules to make cards effective
|
|
156
|
+
6. Use addNote tool only after user confirms
|
|
157
|
+
|
|
158
|
+
## Example Transformations
|
|
159
|
+
|
|
160
|
+
### Example 1: Complex → Simple
|
|
161
|
+
❌ **Bad Card**:
|
|
162
|
+
Q: "What are the main differences between REST and GraphQL APIs and when would you use each?"
|
|
163
|
+
A: [Long paragraph explaining both]
|
|
164
|
+
|
|
165
|
+
✅ **Good Cards** (4 separate cards):
|
|
166
|
+
1. "REST uses {{c1::multiple endpoints}}, GraphQL uses {{c2::single endpoint}}"
|
|
167
|
+
2. "GraphQL advantage over REST: {{c1::client specifies exact data needed}}"
|
|
168
|
+
3. "REST advantage over GraphQL: {{c1::simpler caching}} and {{c2::better tooling support}}"
|
|
169
|
+
4. "Use GraphQL when: {{c1::client needs flexible queries}} and {{c2::reducing over-fetching matters}}"
|
|
170
|
+
|
|
171
|
+
### Example 2: Generic → Personal
|
|
172
|
+
❌ **Bad Card**:
|
|
173
|
+
Q: "What is a closure in JavaScript?"
|
|
174
|
+
A: "A function that has access to outer function variables"
|
|
175
|
+
|
|
176
|
+
✅ **Good Card**:
|
|
177
|
+
Q: "js: Closure definition (like in your React hooks code)?"
|
|
178
|
+
A: "Function that remembers variables from its outer scope even after outer function returns"
|
|
179
|
+
|
|
180
|
+
### Example 3: Adding Visual Memory
|
|
181
|
+
❌ **Text Only**:
|
|
182
|
+
Q: "Structure of the human heart?"
|
|
183
|
+
A: [Text description]
|
|
184
|
+
|
|
185
|
+
✅ **With Image**:
|
|
186
|
+
Q: [Image of heart with blank labels]
|
|
187
|
+
A: [Same image with labels visible]
|
|
188
|
+
(Use mediaActions to help user add the image)
|
|
189
|
+
|
|
190
|
+
## Remember
|
|
191
|
+
|
|
192
|
+
**Quality > Quantity**: Five well-formed cards beat twenty poorly made ones.
|
|
193
|
+
**Atomic Knowledge**: One fact per card, always.
|
|
194
|
+
**User Context**: Personalize everything you can.
|
|
195
|
+
**Understanding First**: Never create cards from material the user doesn't understand.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.TwentyRulesPrompt = void 0;
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
48
|
+
const zod_1 = require("zod");
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const markdown_utils_1 = require("../../../../utils/markdown.utils");
|
|
52
|
+
const PROMPT_SECTIONS = (() => {
|
|
53
|
+
const markdownPath = path.join(__dirname, "content.md");
|
|
54
|
+
const markdown = fs.readFileSync(markdownPath, "utf-8");
|
|
55
|
+
return (0, markdown_utils_1.parseMarkdownSections)(markdown);
|
|
56
|
+
})();
|
|
57
|
+
let TwentyRulesPrompt = class TwentyRulesPrompt {
|
|
58
|
+
getTwentyRulesPrompt() {
|
|
59
|
+
return {
|
|
60
|
+
description: PROMPT_SECTIONS.Description ||
|
|
61
|
+
"Twenty rules of formulating knowledge for effective Anki flashcard creation",
|
|
62
|
+
messages: [
|
|
63
|
+
{
|
|
64
|
+
role: "user",
|
|
65
|
+
content: {
|
|
66
|
+
type: "text",
|
|
67
|
+
text: PROMPT_SECTIONS.Content || "",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.TwentyRulesPrompt = TwentyRulesPrompt;
|
|
75
|
+
__decorate([
|
|
76
|
+
(0, mcp_nest_1.Prompt)({
|
|
77
|
+
name: "twenty_rules",
|
|
78
|
+
description: PROMPT_SECTIONS.Description ||
|
|
79
|
+
"Twenty rules of formulating knowledge for effective Anki flashcard creation",
|
|
80
|
+
parameters: zod_1.z.object({}),
|
|
81
|
+
}),
|
|
82
|
+
__metadata("design:type", Function),
|
|
83
|
+
__metadata("design:paramtypes", []),
|
|
84
|
+
__metadata("design:returntype", void 0)
|
|
85
|
+
], TwentyRulesPrompt.prototype, "getTwentyRulesPrompt", null);
|
|
86
|
+
exports.TwentyRulesPrompt = TwentyRulesPrompt = __decorate([
|
|
87
|
+
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST })
|
|
88
|
+
], TwentyRulesPrompt);
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/prompts/twenty-rules.prompt/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAAyC;AACzC,6BAAwB;AACxB,uCAAyB;AACzB,2CAA6B;AAC7B,qEAAmE;AAInE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,IAAA,sCAAqB,EAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC,EAAE,CAAC;AAGE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAQ5B,oBAAoB;QAClB,OAAO;YACL,WAAW,EACT,eAAe,CAAC,WAAW;gBAC3B,6EAA6E;YAC/E,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,eAAe,CAAC,OAAO,IAAI,EAAE;qBACpC;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAxBY,8CAAiB;AAQ5B;IAPC,IAAA,iBAAM,EAAC;QACN,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,eAAe,CAAC,WAAW;YAC3B,6EAA6E;QAC/E,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;6DAgBD;4BAvBU,iBAAiB;IAD7B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;GACxB,iBAAiB,CAwB7B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class SystemInfoResource {
|
|
2
|
+
getSystemInfo({ uri }: {
|
|
3
|
+
uri: string;
|
|
4
|
+
}): {
|
|
5
|
+
contents: {
|
|
6
|
+
uri: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
};
|
|
11
|
+
getEnvironmentVariable({ uri, name }: {
|
|
12
|
+
uri: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}): {
|
|
15
|
+
contents: {
|
|
16
|
+
uri: string;
|
|
17
|
+
mimeType: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.SystemInfoResource = void 0;
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
let SystemInfoResource = class SystemInfoResource {
|
|
50
|
+
getSystemInfo({ uri }) {
|
|
51
|
+
const systemInfo = {
|
|
52
|
+
platform: os.platform(),
|
|
53
|
+
release: os.release(),
|
|
54
|
+
type: os.type(),
|
|
55
|
+
arch: os.arch(),
|
|
56
|
+
cpus: os.cpus().length,
|
|
57
|
+
totalMemory: `${Math.round(os.totalmem() / (1024 * 1024 * 1024))} GB`,
|
|
58
|
+
freeMemory: `${Math.round(os.freemem() / (1024 * 1024 * 1024))} GB`,
|
|
59
|
+
uptime: `${Math.round(os.uptime() / 3600)} hours`,
|
|
60
|
+
hostname: os.hostname(),
|
|
61
|
+
nodeVersion: process.version,
|
|
62
|
+
env: {
|
|
63
|
+
NODE_ENV: process.env.NODE_ENV || "development",
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
contents: [
|
|
68
|
+
{
|
|
69
|
+
uri: uri,
|
|
70
|
+
mimeType: "application/json",
|
|
71
|
+
text: JSON.stringify(systemInfo, null, 2),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
getEnvironmentVariable({ uri, name }) {
|
|
77
|
+
const value = process.env[name.toUpperCase()] || "undefined";
|
|
78
|
+
return {
|
|
79
|
+
contents: [
|
|
80
|
+
{
|
|
81
|
+
uri: uri,
|
|
82
|
+
mimeType: "text/plain",
|
|
83
|
+
text: value,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
exports.SystemInfoResource = SystemInfoResource;
|
|
90
|
+
__decorate([
|
|
91
|
+
(0, mcp_nest_1.Resource)({
|
|
92
|
+
name: "system-info",
|
|
93
|
+
description: "Current system information and environment",
|
|
94
|
+
mimeType: "application/json",
|
|
95
|
+
uri: "system://info",
|
|
96
|
+
}),
|
|
97
|
+
__metadata("design:type", Function),
|
|
98
|
+
__metadata("design:paramtypes", [Object]),
|
|
99
|
+
__metadata("design:returntype", void 0)
|
|
100
|
+
], SystemInfoResource.prototype, "getSystemInfo", null);
|
|
101
|
+
__decorate([
|
|
102
|
+
(0, mcp_nest_1.ResourceTemplate)({
|
|
103
|
+
name: "environment-variable",
|
|
104
|
+
description: "Get a specific environment variable",
|
|
105
|
+
mimeType: "text/plain",
|
|
106
|
+
uriTemplate: "env://{name}",
|
|
107
|
+
}),
|
|
108
|
+
__metadata("design:type", Function),
|
|
109
|
+
__metadata("design:paramtypes", [Object]),
|
|
110
|
+
__metadata("design:returntype", void 0)
|
|
111
|
+
], SystemInfoResource.prototype, "getEnvironmentVariable", null);
|
|
112
|
+
exports.SystemInfoResource = SystemInfoResource = __decorate([
|
|
113
|
+
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST })
|
|
114
|
+
], SystemInfoResource);
|
|
115
|
+
//# sourceMappingURL=system-info.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-info.resource.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/resources/system-info.resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAA6D;AAC7D,uCAAyB;AAGlB,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAO7B,aAAa,CAAC,EAAE,GAAG,EAAmB;QACpC,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;YACrB,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;YACf,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;YACf,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;YACtB,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK;YACrE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK;YACnE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;YACjD,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,GAAG,EAAE;gBACH,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;aAChD;SACF,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC;IAQD,sBAAsB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAiC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,WAAW,CAAC;QAE7D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,KAAK;iBACZ;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAtDY,gDAAkB;AAO7B;IANC,IAAA,mBAAQ,EAAC;QACR,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,4CAA4C;QACzD,QAAQ,EAAE,kBAAkB;QAC5B,GAAG,EAAE,eAAe;KACrB,CAAC;;;;uDA2BD;AAQD;IANC,IAAA,2BAAgB,EAAC;QAChB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,cAAc;KAC5B,CAAC;;;;gEAaD;6BArDU,kBAAkB;IAD9B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;GACxB,kBAAkB,CAsD9B"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
|
+
export declare class AddNoteTool {
|
|
4
|
+
private readonly ankiClient;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
+
addNote({ deckName, modelName, fields, tags, allowDuplicate, duplicateScope, duplicateScopeOptions, }: {
|
|
8
|
+
deckName: string;
|
|
9
|
+
modelName: string;
|
|
10
|
+
fields: Record<string, string>;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
allowDuplicate?: boolean;
|
|
13
|
+
duplicateScope?: "deck" | "collection";
|
|
14
|
+
duplicateScopeOptions?: {
|
|
15
|
+
deckName?: string;
|
|
16
|
+
checkChildren?: boolean;
|
|
17
|
+
checkAllModels?: boolean;
|
|
18
|
+
};
|
|
19
|
+
}, context: Context): Promise<{
|
|
20
|
+
[x: string]: unknown;
|
|
21
|
+
content: ({
|
|
22
|
+
[x: string]: unknown;
|
|
23
|
+
type: "text";
|
|
24
|
+
text: string;
|
|
25
|
+
_meta?: {
|
|
26
|
+
[x: string]: unknown;
|
|
27
|
+
} | undefined;
|
|
28
|
+
} | {
|
|
29
|
+
[x: string]: unknown;
|
|
30
|
+
type: "image";
|
|
31
|
+
data: string;
|
|
32
|
+
mimeType: string;
|
|
33
|
+
_meta?: {
|
|
34
|
+
[x: string]: unknown;
|
|
35
|
+
} | undefined;
|
|
36
|
+
} | {
|
|
37
|
+
[x: string]: unknown;
|
|
38
|
+
type: "audio";
|
|
39
|
+
data: string;
|
|
40
|
+
mimeType: string;
|
|
41
|
+
_meta?: {
|
|
42
|
+
[x: string]: unknown;
|
|
43
|
+
} | undefined;
|
|
44
|
+
} | {
|
|
45
|
+
[x: string]: unknown;
|
|
46
|
+
type: "resource_link";
|
|
47
|
+
name: string;
|
|
48
|
+
uri: string;
|
|
49
|
+
_meta?: {
|
|
50
|
+
[x: string]: unknown;
|
|
51
|
+
} | undefined;
|
|
52
|
+
mimeType?: string | undefined;
|
|
53
|
+
title?: string | undefined;
|
|
54
|
+
description?: string | undefined;
|
|
55
|
+
icons?: {
|
|
56
|
+
[x: string]: unknown;
|
|
57
|
+
src: string;
|
|
58
|
+
mimeType?: string | undefined;
|
|
59
|
+
sizes?: string[] | undefined;
|
|
60
|
+
}[] | undefined;
|
|
61
|
+
} | {
|
|
62
|
+
[x: string]: unknown;
|
|
63
|
+
type: "resource";
|
|
64
|
+
resource: {
|
|
65
|
+
[x: string]: unknown;
|
|
66
|
+
text: string;
|
|
67
|
+
uri: string;
|
|
68
|
+
_meta?: {
|
|
69
|
+
[x: string]: unknown;
|
|
70
|
+
} | undefined;
|
|
71
|
+
mimeType?: string | undefined;
|
|
72
|
+
} | {
|
|
73
|
+
[x: string]: unknown;
|
|
74
|
+
uri: string;
|
|
75
|
+
blob: string;
|
|
76
|
+
_meta?: {
|
|
77
|
+
[x: string]: unknown;
|
|
78
|
+
} | undefined;
|
|
79
|
+
mimeType?: string | undefined;
|
|
80
|
+
};
|
|
81
|
+
_meta?: {
|
|
82
|
+
[x: string]: unknown;
|
|
83
|
+
} | undefined;
|
|
84
|
+
})[];
|
|
85
|
+
_meta?: {
|
|
86
|
+
[x: string]: unknown;
|
|
87
|
+
} | undefined;
|
|
88
|
+
structuredContent?: {
|
|
89
|
+
[x: string]: unknown;
|
|
90
|
+
} | undefined;
|
|
91
|
+
isError?: boolean | undefined;
|
|
92
|
+
}>;
|
|
93
|
+
}
|