openhive-mcp-server 1.3.0 → 1.5.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 (2) hide show
  1. package/index.js +109 -8
  2. package/package.json +2 -2
package/index.js CHANGED
@@ -53,7 +53,7 @@ async function apiRequest(path, options = {}) {
53
53
  return data.data;
54
54
  }
55
55
 
56
- const server = new McpServer({ name: 'openhive', version: '1.3.0' });
56
+ const server = new McpServer({ name: 'openhive', version: '1.5.0' });
57
57
 
58
58
  // ── Posts ──
59
59
 
@@ -681,6 +681,87 @@ server.tool(
681
681
  }
682
682
  );
683
683
 
684
+ // ── Design Systems (visual inspirations library) ──
685
+
686
+ server.tool(
687
+ 'list_design_systems',
688
+ 'Lista a biblioteca de 58 design systems de marcas conhecidas (Stripe, Linear, Apple, Notion, etc) que podem ser usados como inspiracao visual para criar brands. Cada item retorna nome, vibe, categoria, paleta principal e mood keywords. Use isso quando o usuario pedir ajuda para criar um brand do zero ou refinar a identidade visual',
689
+ {
690
+ category: z.enum(['fintech', 'productivity', 'dev-tools', 'ai', 'luxury', 'automotive', 'social', 'media', 'other']).optional().describe('Filtrar por categoria'),
691
+ search: z.string().optional().describe('Buscar por nome, vibe ou mood keyword (ex: warm, dark, minimal)'),
692
+ limit: z.number().optional().describe('Quantidade maxima a retornar'),
693
+ },
694
+ async (input) => {
695
+ const params = new URLSearchParams();
696
+ if (input.category) params.set('category', input.category);
697
+ if (input.search) params.set('search', input.search);
698
+ if (input.limit) params.set('limit', String(input.limit));
699
+ const qs = params.toString();
700
+ const result = await apiRequest(`/api/design-systems${qs ? '?' + qs : ''}`);
701
+ return {
702
+ content: [{
703
+ type: 'text',
704
+ text: JSON.stringify({
705
+ total_in_library: result.totalAvailable,
706
+ returned: result.total,
707
+ design_systems: result.items.map((d) => ({
708
+ id: d.id,
709
+ name: d.name,
710
+ vibe: d.vibe,
711
+ category: d.category,
712
+ mood_keywords: d.moodKeywords,
713
+ primary_color: d.colors.primary,
714
+ secondary_color: d.colors.secondary,
715
+ })),
716
+ }, null, 2),
717
+ }],
718
+ };
719
+ }
720
+ );
721
+
722
+ server.tool(
723
+ 'get_design_system',
724
+ 'Retorna detalhes completos de um design system especifico (todas as cores, tipografia, principios). Use depois de list_design_systems quando o usuario escolher uma inspiracao',
725
+ {
726
+ design_system_id: z.string().describe('ID do design system (ex: stripe, linear, apple)'),
727
+ },
728
+ async (input) => {
729
+ const result = await apiRequest(`/api/design-systems/${input.design_system_id}`);
730
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
731
+ }
732
+ );
733
+
734
+ server.tool(
735
+ 'list_design_system_categories',
736
+ 'Retorna as categorias disponiveis na biblioteca de design systems com a quantidade em cada (fintech, dev-tools, ai, etc)',
737
+ {},
738
+ async () => {
739
+ const result = await apiRequest('/api/design-systems/categories');
740
+ return { content: [{ type: 'text', text: JSON.stringify({ categories: result }, null, 2) }] };
741
+ }
742
+ );
743
+
744
+ server.tool(
745
+ 'suggest_brand_from_inspirations',
746
+ 'Combina 1-5 design systems da biblioteca em uma sugestao de brand. Retorna paleta de cores, fonte, tom de voz e descricao. NAO salva nada - apenas sugere. Para salvar use create_brand depois que o usuario aprovar',
747
+ {
748
+ inspiration_ids: z.array(z.string()).min(1).max(5).describe('IDs dos design systems para combinar (ex: ["stripe", "linear"])'),
749
+ business_name: z.string().optional().describe('Nome do negocio do usuario'),
750
+ business_type: z.string().optional().describe('Tipo de negocio (ex: "AI startup", "fintech")'),
751
+ },
752
+ async (input) => {
753
+ const result = await apiRequest('/api/design-systems/suggest', {
754
+ method: 'POST',
755
+ body: JSON.stringify({
756
+ inspirationIds: input.inspiration_ids,
757
+ businessName: input.business_name,
758
+ businessType: input.business_type,
759
+ }),
760
+ });
761
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
762
+ }
763
+ );
764
+
684
765
  // ── Brands ──
685
766
 
686
767
  server.tool('list_brands', 'Lista todos os brands cadastrados (identidade visual: logo, cores, produtos, tom de voz). Use ANTES de criar qualquer post visual para perguntar ao usuario qual brand aplicar', {}, async () => {
@@ -700,17 +781,22 @@ server.tool('get_default_brand', 'Retorna o brand padrao do usuario (se houver).
700
781
  return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
701
782
  });
702
783
 
703
- server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita website_url e instagram_url para que agentes possam pesquisar informacoes da marca', {
784
+ server.tool('create_brand', 'Cria um novo brand com identidade visual completa: 6 cores (primary, secondary, accent, background, text, muted) + 3 fontes (display, heading, body). Aceita website_url e instagram_url para que agentes possam pesquisar referencias', {
704
785
  name: z.string().describe('Nome do brand'),
705
786
  logo_url: z.string().optional().describe('URL do logo'),
706
- primary_color: z.string().optional().describe('Cor primaria em hex (#RRGGBB)'),
707
- secondary_color: z.string().optional().describe('Cor secundaria em hex (#RRGGBB)'),
708
- accent_color: z.string().optional().describe('Cor de destaque em hex'),
709
- font_family: z.string().optional().describe('Familia de fonte preferida'),
787
+ primary_color: z.string().optional().describe('Cor primaria em hex (#RRGGBB) - cor principal da marca'),
788
+ secondary_color: z.string().optional().describe('Cor secundaria em hex - cor de apoio'),
789
+ accent_color: z.string().optional().describe('Cor de destaque em hex - usada em CTAs e highlights'),
790
+ background_color: z.string().optional().describe('Cor de fundo em hex - cor base dos slides'),
791
+ text_color: z.string().optional().describe('Cor de texto principal em hex'),
792
+ muted_color: z.string().optional().describe('Cor neutra/muted em hex - bordas, textos secundarios'),
793
+ font_family: z.string().optional().describe('Familia de fonte display/principal (ex: Inter Variable)'),
794
+ heading_font: z.string().optional().describe('Fonte para titulos (ex: Sora, Geist)'),
795
+ body_font: z.string().optional().describe('Fonte para textos longos/body (ex: Inter)'),
710
796
  description: z.string().optional().describe('Descricao do brand'),
711
797
  voice_tone: z.string().optional().describe('Tom de voz: profissional, descontraido, educativo'),
712
798
  website_url: z.string().optional().describe('URL do site oficial - agentes podem visitar para pesquisar informacoes e contexto'),
713
- instagram_url: z.string().optional().describe('URL do perfil Instagram - agentes podem analisar o estilo visual e de conteudo para manter consistencia'),
799
+ instagram_url: z.string().optional().describe('URL do perfil Instagram - agentes podem analisar o estilo visual e de conteudo'),
714
800
  products: z.array(z.string()).optional().describe('Lista de produtos/servicos'),
715
801
  default_hashtags: z.array(z.string()).optional().describe('Hashtags padrao a aplicar nos posts'),
716
802
  is_default: z.boolean().optional().describe('Se este sera o brand padrao'),
@@ -721,7 +807,12 @@ server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita we
721
807
  primaryColor: input.primary_color,
722
808
  secondaryColor: input.secondary_color,
723
809
  accentColor: input.accent_color,
810
+ backgroundColor: input.background_color,
811
+ textColor: input.text_color,
812
+ mutedColor: input.muted_color,
724
813
  fontFamily: input.font_family,
814
+ headingFont: input.heading_font,
815
+ bodyFont: input.body_font,
725
816
  description: input.description,
726
817
  voiceTone: input.voice_tone,
727
818
  websiteUrl: input.website_url,
@@ -736,14 +827,19 @@ server.tool('create_brand', 'Cria um novo brand com identidade visual. Aceita we
736
827
  return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
737
828
  });
738
829
 
739
- server.tool('update_brand', 'Atualiza um brand existente', {
830
+ server.tool('update_brand', 'Atualiza um brand existente. Todos os campos sao opcionais - so envie o que quer mudar', {
740
831
  brand_id: z.string().describe('ID do brand'),
741
832
  name: z.string().optional(),
742
833
  logo_url: z.string().optional(),
743
834
  primary_color: z.string().optional(),
744
835
  secondary_color: z.string().optional(),
745
836
  accent_color: z.string().optional(),
837
+ background_color: z.string().optional(),
838
+ text_color: z.string().optional(),
839
+ muted_color: z.string().optional(),
746
840
  font_family: z.string().optional(),
841
+ heading_font: z.string().optional(),
842
+ body_font: z.string().optional(),
747
843
  description: z.string().optional(),
748
844
  voice_tone: z.string().optional(),
749
845
  website_url: z.string().optional(),
@@ -758,7 +854,12 @@ server.tool('update_brand', 'Atualiza um brand existente', {
758
854
  if (input.primary_color !== undefined) body.primaryColor = input.primary_color;
759
855
  if (input.secondary_color !== undefined) body.secondaryColor = input.secondary_color;
760
856
  if (input.accent_color !== undefined) body.accentColor = input.accent_color;
857
+ if (input.background_color !== undefined) body.backgroundColor = input.background_color;
858
+ if (input.text_color !== undefined) body.textColor = input.text_color;
859
+ if (input.muted_color !== undefined) body.mutedColor = input.muted_color;
761
860
  if (input.font_family !== undefined) body.fontFamily = input.font_family;
861
+ if (input.heading_font !== undefined) body.headingFont = input.heading_font;
862
+ if (input.body_font !== undefined) body.bodyFont = input.body_font;
762
863
  if (input.description !== undefined) body.description = input.description;
763
864
  if (input.voice_tone !== undefined) body.voiceTone = input.voice_tone;
764
865
  if (input.website_url !== undefined) body.websiteUrl = input.website_url;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "openhive-mcp-server",
3
- "version": "1.3.0",
4
- "description": "OpenHive AI MCP Server - Connect Claude, Antigravity, Cursor and other IDEs to your OpenHive instance. 35 tools including Brands (with website_url + instagram_url for research) and Mixed Carousel.",
3
+ "version": "1.5.0",
4
+ "description": "OpenHive AI MCP Server - Connect Claude, Antigravity, Cursor and other IDEs to your OpenHive instance. 39 tools including Design Systems library (58 brand inspirations), Brands (6 colors + 3 fonts), Mixed Carousel.",
5
5
  "main": "index.js",
6
6
  "bin": {
7
7
  "openhive-mcp": "./index.js"