@iwo-szapar/data-mcp 0.1.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 (213) hide show
  1. package/dist/adapter/factory.d.ts +9 -0
  2. package/dist/adapter/factory.d.ts.map +1 -0
  3. package/dist/adapter/factory.js +23 -0
  4. package/dist/adapter/factory.js.map +1 -0
  5. package/dist/adapter/pocketbase.d.ts +37 -0
  6. package/dist/adapter/pocketbase.d.ts.map +1 -0
  7. package/dist/adapter/pocketbase.js +350 -0
  8. package/dist/adapter/pocketbase.js.map +1 -0
  9. package/dist/adapter/schema-map.d.ts +45 -0
  10. package/dist/adapter/schema-map.d.ts.map +1 -0
  11. package/dist/adapter/schema-map.js +75 -0
  12. package/dist/adapter/schema-map.js.map +1 -0
  13. package/dist/adapter/supabase.d.ts +32 -0
  14. package/dist/adapter/supabase.d.ts.map +1 -0
  15. package/dist/adapter/supabase.js +294 -0
  16. package/dist/adapter/supabase.js.map +1 -0
  17. package/dist/adapter/types.d.ts +67 -0
  18. package/dist/adapter/types.d.ts.map +1 -0
  19. package/dist/adapter/types.js +9 -0
  20. package/dist/adapter/types.js.map +1 -0
  21. package/dist/config.d.ts +31 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +62 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/errors/adapter-error.d.ts +12 -0
  26. package/dist/errors/adapter-error.d.ts.map +1 -0
  27. package/dist/errors/adapter-error.js +15 -0
  28. package/dist/errors/adapter-error.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +27 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/search/alias-expansion.d.ts +53 -0
  34. package/dist/search/alias-expansion.d.ts.map +1 -0
  35. package/dist/search/alias-expansion.js +131 -0
  36. package/dist/search/alias-expansion.js.map +1 -0
  37. package/dist/server.d.ts +9 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +40 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/business/blog-create.d.ts +9 -0
  42. package/dist/tools/business/blog-create.d.ts.map +1 -0
  43. package/dist/tools/business/blog-create.js +53 -0
  44. package/dist/tools/business/blog-create.js.map +1 -0
  45. package/dist/tools/business/blog-delete.d.ts +9 -0
  46. package/dist/tools/business/blog-delete.d.ts.map +1 -0
  47. package/dist/tools/business/blog-delete.js +29 -0
  48. package/dist/tools/business/blog-delete.js.map +1 -0
  49. package/dist/tools/business/blog-list.d.ts +9 -0
  50. package/dist/tools/business/blog-list.d.ts.map +1 -0
  51. package/dist/tools/business/blog-list.js +37 -0
  52. package/dist/tools/business/blog-list.js.map +1 -0
  53. package/dist/tools/business/blog-update.d.ts +9 -0
  54. package/dist/tools/business/blog-update.d.ts.map +1 -0
  55. package/dist/tools/business/blog-update.js +66 -0
  56. package/dist/tools/business/blog-update.js.map +1 -0
  57. package/dist/tools/business/content-queue-add.d.ts +9 -0
  58. package/dist/tools/business/content-queue-add.d.ts.map +1 -0
  59. package/dist/tools/business/content-queue-add.js +40 -0
  60. package/dist/tools/business/content-queue-add.js.map +1 -0
  61. package/dist/tools/business/content-queue-list.d.ts +9 -0
  62. package/dist/tools/business/content-queue-list.d.ts.map +1 -0
  63. package/dist/tools/business/content-queue-list.js +41 -0
  64. package/dist/tools/business/content-queue-list.js.map +1 -0
  65. package/dist/tools/business/email-queue-add.d.ts +9 -0
  66. package/dist/tools/business/email-queue-add.d.ts.map +1 -0
  67. package/dist/tools/business/email-queue-add.js +47 -0
  68. package/dist/tools/business/email-queue-add.js.map +1 -0
  69. package/dist/tools/business/prospect-create.d.ts +9 -0
  70. package/dist/tools/business/prospect-create.d.ts.map +1 -0
  71. package/dist/tools/business/prospect-create.js +50 -0
  72. package/dist/tools/business/prospect-create.js.map +1 -0
  73. package/dist/tools/business/prospect-list.d.ts +9 -0
  74. package/dist/tools/business/prospect-list.d.ts.map +1 -0
  75. package/dist/tools/business/prospect-list.js +37 -0
  76. package/dist/tools/business/prospect-list.js.map +1 -0
  77. package/dist/tools/business/prospect-search.d.ts +9 -0
  78. package/dist/tools/business/prospect-search.d.ts.map +1 -0
  79. package/dist/tools/business/prospect-search.js +29 -0
  80. package/dist/tools/business/prospect-search.js.map +1 -0
  81. package/dist/tools/business/prospect-update.d.ts +9 -0
  82. package/dist/tools/business/prospect-update.d.ts.map +1 -0
  83. package/dist/tools/business/prospect-update.js +68 -0
  84. package/dist/tools/business/prospect-update.js.map +1 -0
  85. package/dist/tools/memory/brain-decay.d.ts +11 -0
  86. package/dist/tools/memory/brain-decay.d.ts.map +1 -0
  87. package/dist/tools/memory/brain-decay.js +58 -0
  88. package/dist/tools/memory/brain-decay.js.map +1 -0
  89. package/dist/tools/memory/brain-stats.d.ts +11 -0
  90. package/dist/tools/memory/brain-stats.d.ts.map +1 -0
  91. package/dist/tools/memory/brain-stats.js +63 -0
  92. package/dist/tools/memory/brain-stats.js.map +1 -0
  93. package/dist/tools/memory/contact-create.d.ts +9 -0
  94. package/dist/tools/memory/contact-create.d.ts.map +1 -0
  95. package/dist/tools/memory/contact-create.js +42 -0
  96. package/dist/tools/memory/contact-create.js.map +1 -0
  97. package/dist/tools/memory/contact-list.d.ts +9 -0
  98. package/dist/tools/memory/contact-list.d.ts.map +1 -0
  99. package/dist/tools/memory/contact-list.js +30 -0
  100. package/dist/tools/memory/contact-list.js.map +1 -0
  101. package/dist/tools/memory/contact-search.d.ts +9 -0
  102. package/dist/tools/memory/contact-search.d.ts.map +1 -0
  103. package/dist/tools/memory/contact-search.js +29 -0
  104. package/dist/tools/memory/contact-search.js.map +1 -0
  105. package/dist/tools/memory/contact-update.d.ts +9 -0
  106. package/dist/tools/memory/contact-update.d.ts.map +1 -0
  107. package/dist/tools/memory/contact-update.js +59 -0
  108. package/dist/tools/memory/contact-update.js.map +1 -0
  109. package/dist/tools/memory/goal-create.d.ts +9 -0
  110. package/dist/tools/memory/goal-create.d.ts.map +1 -0
  111. package/dist/tools/memory/goal-create.js +40 -0
  112. package/dist/tools/memory/goal-create.js.map +1 -0
  113. package/dist/tools/memory/goal-list.d.ts +9 -0
  114. package/dist/tools/memory/goal-list.d.ts.map +1 -0
  115. package/dist/tools/memory/goal-list.js +41 -0
  116. package/dist/tools/memory/goal-list.js.map +1 -0
  117. package/dist/tools/memory/goal-update.d.ts +9 -0
  118. package/dist/tools/memory/goal-update.d.ts.map +1 -0
  119. package/dist/tools/memory/goal-update.js +51 -0
  120. package/dist/tools/memory/goal-update.js.map +1 -0
  121. package/dist/tools/memory/knowledge-decide.d.ts +10 -0
  122. package/dist/tools/memory/knowledge-decide.d.ts.map +1 -0
  123. package/dist/tools/memory/knowledge-decide.js +39 -0
  124. package/dist/tools/memory/knowledge-decide.js.map +1 -0
  125. package/dist/tools/memory/knowledge-delete.d.ts +10 -0
  126. package/dist/tools/memory/knowledge-delete.d.ts.map +1 -0
  127. package/dist/tools/memory/knowledge-delete.js +33 -0
  128. package/dist/tools/memory/knowledge-delete.js.map +1 -0
  129. package/dist/tools/memory/knowledge-learn.d.ts +10 -0
  130. package/dist/tools/memory/knowledge-learn.d.ts.map +1 -0
  131. package/dist/tools/memory/knowledge-learn.js +39 -0
  132. package/dist/tools/memory/knowledge-learn.js.map +1 -0
  133. package/dist/tools/memory/knowledge-list.d.ts +9 -0
  134. package/dist/tools/memory/knowledge-list.d.ts.map +1 -0
  135. package/dist/tools/memory/knowledge-list.js +43 -0
  136. package/dist/tools/memory/knowledge-list.js.map +1 -0
  137. package/dist/tools/memory/knowledge-recall.d.ts +11 -0
  138. package/dist/tools/memory/knowledge-recall.d.ts.map +1 -0
  139. package/dist/tools/memory/knowledge-recall.js +79 -0
  140. package/dist/tools/memory/knowledge-recall.js.map +1 -0
  141. package/dist/tools/memory/knowledge-store.d.ts +10 -0
  142. package/dist/tools/memory/knowledge-store.d.ts.map +1 -0
  143. package/dist/tools/memory/knowledge-store.js +56 -0
  144. package/dist/tools/memory/knowledge-store.js.map +1 -0
  145. package/dist/tools/memory/knowledge-update.d.ts +10 -0
  146. package/dist/tools/memory/knowledge-update.d.ts.map +1 -0
  147. package/dist/tools/memory/knowledge-update.js +50 -0
  148. package/dist/tools/memory/knowledge-update.js.map +1 -0
  149. package/dist/tools/memory/knowledge-validate.d.ts +10 -0
  150. package/dist/tools/memory/knowledge-validate.d.ts.map +1 -0
  151. package/dist/tools/memory/knowledge-validate.js +40 -0
  152. package/dist/tools/memory/knowledge-validate.js.map +1 -0
  153. package/dist/tools/memory/session-list.d.ts +9 -0
  154. package/dist/tools/memory/session-list.d.ts.map +1 -0
  155. package/dist/tools/memory/session-list.js +30 -0
  156. package/dist/tools/memory/session-list.js.map +1 -0
  157. package/dist/tools/memory/session-log.d.ts +9 -0
  158. package/dist/tools/memory/session-log.d.ts.map +1 -0
  159. package/dist/tools/memory/session-log.js +56 -0
  160. package/dist/tools/memory/session-log.js.map +1 -0
  161. package/dist/tools/memory/task-create.d.ts +9 -0
  162. package/dist/tools/memory/task-create.d.ts.map +1 -0
  163. package/dist/tools/memory/task-create.js +38 -0
  164. package/dist/tools/memory/task-create.js.map +1 -0
  165. package/dist/tools/memory/task-list.d.ts +9 -0
  166. package/dist/tools/memory/task-list.d.ts.map +1 -0
  167. package/dist/tools/memory/task-list.js +41 -0
  168. package/dist/tools/memory/task-list.js.map +1 -0
  169. package/dist/tools/memory/task-update.d.ts +9 -0
  170. package/dist/tools/memory/task-update.d.ts.map +1 -0
  171. package/dist/tools/memory/task-update.js +50 -0
  172. package/dist/tools/memory/task-update.js.map +1 -0
  173. package/dist/tools/register.d.ts +7 -0
  174. package/dist/tools/register.d.ts.map +1 -0
  175. package/dist/tools/register.js +84 -0
  176. package/dist/tools/register.js.map +1 -0
  177. package/dist/tools/setup/setup-migrate.d.ts +10 -0
  178. package/dist/tools/setup/setup-migrate.d.ts.map +1 -0
  179. package/dist/tools/setup/setup-migrate.js +73 -0
  180. package/dist/tools/setup/setup-migrate.js.map +1 -0
  181. package/dist/tools/setup/setup-seed.d.ts +9 -0
  182. package/dist/tools/setup/setup-seed.d.ts.map +1 -0
  183. package/dist/tools/setup/setup-seed.js +133 -0
  184. package/dist/tools/setup/setup-seed.js.map +1 -0
  185. package/dist/tools/setup/setup-status.d.ts +9 -0
  186. package/dist/tools/setup/setup-status.d.ts.map +1 -0
  187. package/dist/tools/setup/setup-status.js +76 -0
  188. package/dist/tools/setup/setup-status.js.map +1 -0
  189. package/dist/tools/shared.d.ts +56 -0
  190. package/dist/tools/shared.d.ts.map +1 -0
  191. package/dist/tools/shared.js +93 -0
  192. package/dist/tools/shared.js.map +1 -0
  193. package/dist/types/records.d.ts +163 -0
  194. package/dist/types/records.d.ts.map +1 -0
  195. package/dist/types/records.js +8 -0
  196. package/dist/types/records.js.map +1 -0
  197. package/migrations/pocketbase/001_core_schema.js +72 -0
  198. package/migrations/pocketbase/002_goals_tasks.js +49 -0
  199. package/migrations/pocketbase/003_contacts.js +29 -0
  200. package/migrations/pocketbase/004_entity_aliases.js +40 -0
  201. package/migrations/pocketbase/005_prospects.js +33 -0
  202. package/migrations/pocketbase/006_business.js +80 -0
  203. package/migrations/pocketbase/007_newsletter_affiliates.js +50 -0
  204. package/migrations/supabase/001_core_schema.sql +78 -0
  205. package/migrations/supabase/002_goals_tasks.sql +38 -0
  206. package/migrations/supabase/003_contacts.sql +27 -0
  207. package/migrations/supabase/004_entity_aliases.sql +22 -0
  208. package/migrations/supabase/005_prospects.sql +31 -0
  209. package/migrations/supabase/006_business.sql +68 -0
  210. package/migrations/supabase/007_seed_aliases.sql +69 -0
  211. package/migrations/supabase/008_newsletter_affiliates.sql +39 -0
  212. package/package.json +48 -0
  213. package/seed/entity-aliases.json +57 -0
@@ -0,0 +1,27 @@
1
+ -- Migration 003: Contacts
2
+
3
+ CREATE TABLE IF NOT EXISTS contacts (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ name text NOT NULL CHECK (char_length(name) <= 200),
6
+ company text CHECK (char_length(company) <= 200),
7
+ role text CHECK (char_length(role) <= 200),
8
+ email text CHECK (char_length(email) <= 200),
9
+ phone text CHECK (char_length(phone) <= 50),
10
+ relationship text CHECK (relationship IN ('colleague', 'client', 'prospect', 'partner', 'other')),
11
+ notes text CHECK (char_length(notes) <= 5000),
12
+ tags text[] DEFAULT '{}',
13
+ last_contact_date date,
14
+ search_vector tsvector GENERATED ALWAYS AS (
15
+ setweight(to_tsvector('english', coalesce(name, '')), 'A') ||
16
+ setweight(to_tsvector('english', coalesce(company, '')), 'B') ||
17
+ setweight(to_tsvector('english', coalesce(notes, '')), 'C')
18
+ ) STORED,
19
+ created_at timestamptz DEFAULT now(),
20
+ updated_at timestamptz DEFAULT now()
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_contacts_search ON contacts USING gin(search_vector);
24
+ CREATE INDEX IF NOT EXISTS idx_contacts_name ON contacts (name);
25
+
26
+ CREATE TRIGGER contacts_updated_at BEFORE UPDATE ON contacts
27
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,22 @@
1
+ -- Migration 004: Entity aliases + settings
2
+
3
+ CREATE TABLE IF NOT EXISTS entity_aliases (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ canonical text NOT NULL CHECK (char_length(canonical) <= 100),
6
+ alias text NOT NULL CHECK (char_length(alias) <= 200),
7
+ created_at timestamptz DEFAULT now(),
8
+ UNIQUE (canonical, alias)
9
+ );
10
+
11
+ CREATE INDEX IF NOT EXISTS idx_entity_aliases_canonical ON entity_aliases (canonical);
12
+ CREATE INDEX IF NOT EXISTS idx_entity_aliases_alias ON entity_aliases (alias);
13
+
14
+ CREATE TABLE IF NOT EXISTS settings (
15
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
16
+ key text NOT NULL UNIQUE CHECK (char_length(key) <= 100),
17
+ value text,
18
+ updated_at timestamptz DEFAULT now()
19
+ );
20
+
21
+ CREATE TRIGGER settings_updated_at BEFORE UPDATE ON settings
22
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,31 @@
1
+ -- Migration 005: Prospects (CRM)
2
+
3
+ CREATE TABLE IF NOT EXISTS prospects (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ name text NOT NULL CHECK (char_length(name) <= 200),
6
+ email text CHECK (char_length(email) <= 200),
7
+ company text CHECK (char_length(company) <= 200),
8
+ role text CHECK (char_length(role) <= 200),
9
+ stage text NOT NULL DEFAULT 'new' CHECK (stage IN ('new', 'contacted', 'responded', 'interested', 'ready_to_buy', 'proposal_sent', 'negotiating', 'closed_won', 'closed_lost', 'nurturing')),
10
+ source text CHECK (char_length(source) <= 200),
11
+ estimated_value int,
12
+ next_action_type text CHECK (char_length(next_action_type) <= 100),
13
+ next_followup_date date,
14
+ last_contact_date date,
15
+ notes text CHECK (char_length(notes) <= 10000),
16
+ tags text[] DEFAULT '{}',
17
+ linkedin_url text CHECK (char_length(linkedin_url) <= 500),
18
+ search_vector tsvector GENERATED ALWAYS AS (
19
+ setweight(to_tsvector('english', coalesce(name, '')), 'A') ||
20
+ setweight(to_tsvector('english', coalesce(company, '')), 'B') ||
21
+ setweight(to_tsvector('english', coalesce(notes, '')), 'C')
22
+ ) STORED,
23
+ created_at timestamptz DEFAULT now(),
24
+ updated_at timestamptz DEFAULT now()
25
+ );
26
+
27
+ CREATE INDEX IF NOT EXISTS idx_prospects_stage ON prospects (stage);
28
+ CREATE INDEX IF NOT EXISTS idx_prospects_search ON prospects USING gin(search_vector);
29
+
30
+ CREATE TRIGGER prospects_updated_at BEFORE UPDATE ON prospects
31
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,68 @@
1
+ -- Migration 006: Business tables (blog_posts, email_queue, content_calendar)
2
+
3
+ CREATE TABLE IF NOT EXISTS blog_posts (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ title text NOT NULL CHECK (char_length(title) <= 500),
6
+ slug text NOT NULL UNIQUE CHECK (char_length(slug) <= 200),
7
+ content text NOT NULL,
8
+ excerpt text CHECK (char_length(excerpt) <= 500),
9
+ status text NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
10
+ published_at timestamptz,
11
+ tags text[] DEFAULT '{}',
12
+ seo_title text CHECK (char_length(seo_title) <= 200),
13
+ seo_description text CHECK (char_length(seo_description) <= 300),
14
+ og_image_url text CHECK (char_length(og_image_url) <= 500),
15
+ search_vector tsvector GENERATED ALWAYS AS (
16
+ setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
17
+ setweight(to_tsvector('english', coalesce(content, '')), 'B')
18
+ ) STORED,
19
+ created_at timestamptz DEFAULT now(),
20
+ updated_at timestamptz DEFAULT now()
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_blog_posts_slug ON blog_posts (slug);
24
+ CREATE INDEX IF NOT EXISTS idx_blog_posts_status ON blog_posts (status);
25
+ CREATE INDEX IF NOT EXISTS idx_blog_posts_search ON blog_posts USING gin(search_vector);
26
+
27
+ CREATE TABLE IF NOT EXISTS email_queue (
28
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
29
+ to_email text NOT NULL CHECK (char_length(to_email) <= 200),
30
+ to_name text CHECK (char_length(to_name) <= 200),
31
+ subject text NOT NULL CHECK (char_length(subject) <= 500),
32
+ body_html text NOT NULL,
33
+ body_text text,
34
+ status text NOT NULL DEFAULT 'queued' CHECK (status IN ('queued', 'sent', 'failed', 'bounced')),
35
+ sequence_id text CHECK (char_length(sequence_id) <= 100),
36
+ sequence_step int,
37
+ prospect_id uuid,
38
+ scheduled_at timestamptz,
39
+ sent_at timestamptz,
40
+ error text,
41
+ resend_id text CHECK (char_length(resend_id) <= 200),
42
+ created_at timestamptz DEFAULT now()
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_email_queue_status ON email_queue (status);
46
+
47
+ CREATE TABLE IF NOT EXISTS content_calendar (
48
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
49
+ title text NOT NULL CHECK (char_length(title) <= 500),
50
+ content text,
51
+ platform text NOT NULL CHECK (platform IN ('linkedin', 'newsletter', 'blog', 'twitter', 'other')),
52
+ pillar text CHECK (char_length(pillar) <= 100),
53
+ status text NOT NULL DEFAULT 'idea' CHECK (status IN ('idea', 'drafting', 'ready', 'published')),
54
+ scheduled_date date,
55
+ published_url text CHECK (char_length(published_url) <= 500),
56
+ persona text CHECK (char_length(persona) <= 100),
57
+ created_at timestamptz DEFAULT now(),
58
+ updated_at timestamptz DEFAULT now()
59
+ );
60
+
61
+ CREATE INDEX IF NOT EXISTS idx_content_calendar_platform ON content_calendar (platform);
62
+ CREATE INDEX IF NOT EXISTS idx_content_calendar_status ON content_calendar (status);
63
+
64
+ CREATE TRIGGER blog_posts_updated_at BEFORE UPDATE ON blog_posts
65
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
66
+
67
+ CREATE TRIGGER content_calendar_updated_at BEFORE UPDATE ON content_calendar
68
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,69 @@
1
+ -- Migration 007: Seed entity aliases
2
+ -- Uses ON CONFLICT DO NOTHING to be idempotent
3
+
4
+ INSERT INTO entity_aliases (canonical, alias) VALUES
5
+ ('stripe', 'payment'),
6
+ ('stripe', 'checkout'),
7
+ ('stripe', 'pricing'),
8
+ ('stripe', 'invoice'),
9
+ ('stripe', 'billing'),
10
+ ('stripe', 'subscription'),
11
+ ('anthropic', 'claude'),
12
+ ('anthropic', 'ai'),
13
+ ('anthropic', 'llm'),
14
+ ('anthropic', 'artificial intelligence'),
15
+ ('supabase', 'database'),
16
+ ('supabase', 'postgres'),
17
+ ('supabase', 'postgresql'),
18
+ ('supabase', 'db'),
19
+ ('supabase', 'auth'),
20
+ ('github', 'git'),
21
+ ('github', 'repository'),
22
+ ('github', 'repo'),
23
+ ('github', 'version control'),
24
+ ('github', 'source code'),
25
+ ('vercel', 'deployment'),
26
+ ('vercel', 'hosting'),
27
+ ('vercel', 'serverless'),
28
+ ('vercel', 'edge functions'),
29
+ ('react', 'frontend'),
30
+ ('react', 'ui'),
31
+ ('react', 'component'),
32
+ ('react', 'jsx'),
33
+ ('react', 'tsx'),
34
+ ('typescript', 'ts'),
35
+ ('typescript', 'type'),
36
+ ('typescript', 'typing'),
37
+ ('javascript', 'js'),
38
+ ('javascript', 'node'),
39
+ ('javascript', 'nodejs'),
40
+ ('css', 'styling'),
41
+ ('css', 'tailwind'),
42
+ ('css', 'design'),
43
+ ('testing', 'test'),
44
+ ('testing', 'vitest'),
45
+ ('testing', 'unit test'),
46
+ ('testing', 'integration test'),
47
+ ('api', 'endpoint'),
48
+ ('api', 'rest'),
49
+ ('api', 'http'),
50
+ ('api', 'route'),
51
+ ('mcp', 'model context protocol'),
52
+ ('mcp', 'tools'),
53
+ ('mcp', 'server'),
54
+ ('email', 'resend'),
55
+ ('email', 'newsletter'),
56
+ ('email', 'mail'),
57
+ ('pocketbase', 'pb'),
58
+ ('pocketbase', 'local database'),
59
+ ('pocketbase', 'sqlite')
60
+ ON CONFLICT (canonical, alias) DO NOTHING;
61
+
62
+ -- Seed default settings
63
+ INSERT INTO settings (key, value) VALUES
64
+ ('schema_version', '1'),
65
+ ('business_name', ''),
66
+ ('support_email', ''),
67
+ ('timezone', 'UTC'),
68
+ ('currency', 'USD')
69
+ ON CONFLICT (key) DO NOTHING;
@@ -0,0 +1,39 @@
1
+ -- Migration 008: Newsletter subscribers and affiliates
2
+
3
+ CREATE TABLE IF NOT EXISTS newsletter_subscribers (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ email text NOT NULL UNIQUE CHECK (char_length(email) <= 200),
6
+ name text CHECK (char_length(name) <= 200),
7
+ status text NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'unsubscribed', 'bounced')),
8
+ source text CHECK (char_length(source) <= 200),
9
+ tags text[] DEFAULT '{}',
10
+ subscribed_at timestamptz DEFAULT now(),
11
+ unsubscribed_at timestamptz,
12
+ created_at timestamptz DEFAULT now(),
13
+ updated_at timestamptz DEFAULT now()
14
+ );
15
+
16
+ CREATE INDEX IF NOT EXISTS idx_newsletter_subscribers_status ON newsletter_subscribers (status);
17
+
18
+ CREATE TABLE IF NOT EXISTS affiliates (
19
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
20
+ name text NOT NULL CHECK (char_length(name) <= 200),
21
+ email text NOT NULL UNIQUE CHECK (char_length(email) <= 200),
22
+ code text NOT NULL UNIQUE CHECK (char_length(code) <= 100),
23
+ commission_rate float NOT NULL DEFAULT 0.20 CHECK (commission_rate >= 0 AND commission_rate <= 1),
24
+ status text NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'active', 'paused', 'terminated')),
25
+ total_earned_cents int NOT NULL DEFAULT 0,
26
+ total_paid_cents int NOT NULL DEFAULT 0,
27
+ stripe_account_id text CHECK (char_length(stripe_account_id) <= 200),
28
+ created_at timestamptz DEFAULT now(),
29
+ updated_at timestamptz DEFAULT now()
30
+ );
31
+
32
+ CREATE INDEX IF NOT EXISTS idx_affiliates_status ON affiliates (status);
33
+ CREATE INDEX IF NOT EXISTS idx_affiliates_code ON affiliates (code);
34
+
35
+ CREATE TRIGGER newsletter_subscribers_updated_at BEFORE UPDATE ON newsletter_subscribers
36
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
37
+
38
+ CREATE TRIGGER affiliates_updated_at BEFORE UPDATE ON affiliates
39
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@iwo-szapar/data-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Unified data MCP server for Second Brain \u2014 PocketBase and Supabase adapters",
5
+ "type": "module",
6
+ "bin": {
7
+ "data-mcp": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "typecheck": "tsc --noEmit",
14
+ "dev": "tsx src/index.ts",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "test:coverage": "vitest run --coverage",
18
+ "lint": "eslint src/"
19
+ },
20
+ "files": [
21
+ "dist/",
22
+ "migrations/",
23
+ "seed/"
24
+ ],
25
+ "keywords": [
26
+ "mcp",
27
+ "second-brain",
28
+ "pocketbase",
29
+ "supabase",
30
+ "knowledge-management"
31
+ ],
32
+ "license": "MIT",
33
+ "engines": {
34
+ "node": ">=20"
35
+ },
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.12.1",
38
+ "@supabase/supabase-js": "^2.49.4",
39
+ "pocketbase": "^0.25.2",
40
+ "zod": "^3.24.4"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.15.3",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^3.1.1",
46
+ "tsx": "^4.19.4"
47
+ }
48
+ }
@@ -0,0 +1,57 @@
1
+ [
2
+ { "canonical": "stripe", "alias": "payment" },
3
+ { "canonical": "stripe", "alias": "checkout" },
4
+ { "canonical": "stripe", "alias": "pricing" },
5
+ { "canonical": "stripe", "alias": "invoice" },
6
+ { "canonical": "stripe", "alias": "billing" },
7
+ { "canonical": "stripe", "alias": "subscription" },
8
+ { "canonical": "anthropic", "alias": "claude" },
9
+ { "canonical": "anthropic", "alias": "ai" },
10
+ { "canonical": "anthropic", "alias": "llm" },
11
+ { "canonical": "anthropic", "alias": "artificial intelligence" },
12
+ { "canonical": "supabase", "alias": "database" },
13
+ { "canonical": "supabase", "alias": "postgres" },
14
+ { "canonical": "supabase", "alias": "postgresql" },
15
+ { "canonical": "supabase", "alias": "db" },
16
+ { "canonical": "supabase", "alias": "auth" },
17
+ { "canonical": "github", "alias": "git" },
18
+ { "canonical": "github", "alias": "repository" },
19
+ { "canonical": "github", "alias": "repo" },
20
+ { "canonical": "github", "alias": "version control" },
21
+ { "canonical": "github", "alias": "source code" },
22
+ { "canonical": "vercel", "alias": "deployment" },
23
+ { "canonical": "vercel", "alias": "hosting" },
24
+ { "canonical": "vercel", "alias": "serverless" },
25
+ { "canonical": "vercel", "alias": "edge functions" },
26
+ { "canonical": "react", "alias": "frontend" },
27
+ { "canonical": "react", "alias": "ui" },
28
+ { "canonical": "react", "alias": "component" },
29
+ { "canonical": "react", "alias": "jsx" },
30
+ { "canonical": "react", "alias": "tsx" },
31
+ { "canonical": "typescript", "alias": "ts" },
32
+ { "canonical": "typescript", "alias": "type" },
33
+ { "canonical": "typescript", "alias": "typing" },
34
+ { "canonical": "javascript", "alias": "js" },
35
+ { "canonical": "javascript", "alias": "node" },
36
+ { "canonical": "javascript", "alias": "nodejs" },
37
+ { "canonical": "css", "alias": "styling" },
38
+ { "canonical": "css", "alias": "tailwind" },
39
+ { "canonical": "css", "alias": "design" },
40
+ { "canonical": "testing", "alias": "test" },
41
+ { "canonical": "testing", "alias": "vitest" },
42
+ { "canonical": "testing", "alias": "unit test" },
43
+ { "canonical": "testing", "alias": "integration test" },
44
+ { "canonical": "api", "alias": "endpoint" },
45
+ { "canonical": "api", "alias": "rest" },
46
+ { "canonical": "api", "alias": "http" },
47
+ { "canonical": "api", "alias": "route" },
48
+ { "canonical": "mcp", "alias": "model context protocol" },
49
+ { "canonical": "mcp", "alias": "tools" },
50
+ { "canonical": "mcp", "alias": "server" },
51
+ { "canonical": "email", "alias": "resend" },
52
+ { "canonical": "email", "alias": "newsletter" },
53
+ { "canonical": "email", "alias": "mail" },
54
+ { "canonical": "pocketbase", "alias": "pb" },
55
+ { "canonical": "pocketbase", "alias": "local database" },
56
+ { "canonical": "pocketbase", "alias": "sqlite" }
57
+ ]