feat: add API key auth flow for Klavis MCP servers (#343)

* feat: update to support more klavis MCP servers

* fix: minor icon fix

* fix: normalize klavis mcp auth flow compatibility

* feat: add API key auth flow for Klavis MCP servers

Servers that use API key authentication (Stripe, Cloudflare, Brave
Search, Exa, Mem0, Resend, Mixpanel, PostHog, Postman, Zendesk,
Intercom) were failing with "Failed to add app" because the frontend
only handled OAuth flows. This adds the complete API key auth path:

- Backend: apiKeyUrls in StrataCreateResponse, submitApiKey() method,
  /servers/submit-api-key route
- Frontend: ApiKeyDialog component, useSubmitApiKey hook, ConnectMCP
  updated to show dialog for API-key servers instead of opening OAuth

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove broken success check in Klavis submitApiKey

The Klavis /mcp-server/instance/set-auth endpoint returns
{ message: "Authentication updated successfully." } without a
success field. Our code checked `data.success` which was always
undefined, causing API key auth to fail even when Klavis accepted
the key. The request() method already throws on non-2xx responses,
so the explicit check was redundant and incorrect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Felarof
2026-02-20 06:01:59 -08:00
committed by GitHub
parent d775cadc17
commit 2e1fc2e8f9
35 changed files with 686 additions and 22 deletions

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="781.361 0 944.893 873.377">
<path fill="rgb(241,110,111)"
d="M1520.766 462.371c-113.508 0-205.508 92-205.508 205.488 0 113.499 92 205.518 205.508 205.518 113.489 0 205.488-92.019 205.488-205.518 0-113.488-91.999-205.488-205.488-205.488zm-533.907.01c-113.489.01-205.498 91.99-205.498 205.488 0 113.489 92.009 205.498 205.498 205.498 113.498 0 205.508-92.009 205.508-205.498 0-113.499-92.01-205.488-205.518-205.488h.01zm472.447-256.883c0 113.489-91.999 205.518-205.488 205.518-113.508 0-205.508-92.029-205.508-205.518S1140.31 0 1253.817 0c113.489 0 205.479 92.009 205.479 205.498h.01z" />
<script xmlns="" />
</svg>

After

Width:  |  Height:  |  Size: 706 B

View File

@@ -0,0 +1,10 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="200" height="200" fill="url(#paint0_linear_2583_2763)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M101.301 115.156C93.672 115.156 87.1331 108.617 87.1331 100.625C87.1331 92.6328 93.3087 86.0939 101.301 86.0939C108.929 86.0939 115.468 92.6328 115.468 100.625C115.468 108.617 109.293 115.156 101.301 115.156ZM59.8878 115.156C52.2591 115.156 45.7202 108.617 45.7202 100.625C45.7202 92.6328 51.8958 86.0939 59.8878 86.0939C67.5165 86.0939 74.0554 92.6328 74.0554 100.625C74.0554 108.617 67.8797 115.156 59.8878 115.156ZM154.338 79.1917C156.155 77.0121 159.424 76.6489 161.604 78.4652C163.783 79.9183 164.51 83.1877 162.694 85.3674L149.616 101.715L162.694 118.062C164.51 120.241 163.783 123.148 161.604 124.964C159.424 126.417 156.155 126.054 154.338 124.237L143.077 110.433L131.816 124.237C129.999 126.417 126.73 126.78 124.55 124.964C122.37 123.511 121.644 120.241 123.46 118.062L136.538 101.715L123.824 85.0041C122.007 82.8245 122.734 79.9183 124.913 78.1019C127.093 76.6489 130.362 77.0121 132.179 78.8285L143.44 92.9961L154.338 79.1917ZM41.3609 55.9424C43.9038 55.9424 46.0835 58.122 46.0835 60.6649V81.3714C50.0794 78.4652 54.802 76.6489 60.251 76.6489C69.3328 76.6489 76.9615 81.7346 80.9575 89.7266C84.9535 82.0979 92.5822 76.6489 101.664 76.6489C114.742 76.6489 124.913 87.547 124.913 100.988C124.913 114.429 114.378 125.327 101.664 125.327C92.5822 125.327 84.9535 120.241 80.9575 112.249C76.9615 119.878 69.3328 125.327 60.251 125.327C47.5365 125.327 37.0017 114.792 37.0017 101.351V60.6649C36.6384 58.122 38.818 55.9424 41.3609 55.9424Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_2583_2763" x1="100" y1="2.98023e-06" x2="100" y2="200" gradientUnits="userSpaceOnUse">
<stop stop-color="#2486FC"/>
<stop offset="1" stop-color="#0061D5"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg width="56" height="64" viewBox="0 0 56 64" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M53.292 15.321l1.5-3.676s-1.909-2.043-4.227-4.358c-2.317-2.315-7.225-.953-7.225-.953L37.751 0H18.12l-5.589 6.334s-4.908-1.362-7.225.953C2.988 9.602 1.08 11.645 1.08 11.645l1.5 3.676-1.91 5.447s5.614 21.236 6.272 23.83c1.295 5.106 2.181 7.08 5.862 9.668 3.68 2.587 10.36 7.08 11.45 7.762 1.091.68 2.455 1.84 3.682 1.84 1.227 0 2.59-1.16 3.68-1.84 1.091-.681 7.77-5.175 11.452-7.762 3.68-2.587 4.567-4.562 5.862-9.668.657-2.594 6.27-23.83 6.27-23.83l-1.908-5.447z" fill="url(#paint0_linear)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M34.888 11.508c.818 0 6.885-1.157 6.885-1.157s7.189 8.68 7.189 10.536c0 1.534-.619 2.134-1.347 2.842-.152.148-.31.3-.467.468l-5.39 5.717a9.42 9.42 0 01-.176.18c-.538.54-1.33 1.336-.772 2.658l.115.269c.613 1.432 1.37 3.2.407 4.99-1.025 1.906-2.78 3.178-3.905 2.967-1.124-.21-3.766-1.589-4.737-2.218-.971-.63-4.05-3.166-4.05-4.137 0-.809 2.214-2.155 3.29-2.81.214-.13.383-.232.48-.298.111-.075.297-.19.526-.332.981-.61 2.754-1.71 2.799-2.197.055-.602.034-.778-.758-2.264-.168-.316-.365-.654-.568-1.004-.754-1.295-1.598-2.745-1.41-3.784.21-1.173 2.05-1.845 3.608-2.415.194-.07.385-.14.567-.209l1.623-.609c1.556-.582 3.284-1.229 3.57-1.36.394-.181.292-.355-.903-.468a54.655 54.655 0 01-.58-.06c-1.48-.157-4.209-.446-5.535-.077-.261.073-.553.152-.86.235-1.49.403-3.317.897-3.493 1.182-.03.05-.06.093-.089.133-.168.238-.277.394-.091 1.406.055.302.169.895.31 1.629.41 2.148 1.053 5.498 1.134 6.25.011.106.024.207.036.305.103.84.171 1.399-.805 1.622l-.255.058c-1.102.252-2.717.623-3.3.623-.584 0-2.2-.37-3.302-.623l-.254-.058c-.976-.223-.907-.782-.804-1.622.012-.098.024-.2.035-.305.081-.753.725-4.112 1.137-6.259.14-.73.253-1.32.308-1.62.185-1.012.076-1.168-.092-1.406a3.743 3.743 0 01-.09-.133c-.174-.285-2-.779-3.491-1.182-.307-.083-.6-.162-.86-.235-1.327-.37-4.055-.08-5.535.077-.226.024-.422.045-.58.06-1.196.113-1.297.287-.903.468.285.131 2.013.778 3.568 1.36.597.223 1.17.437 1.624.609.183.069.373.138.568.21 1.558.57 3.398 1.241 3.608 2.414.187 1.039-.657 2.489-1.41 3.784-.204.35-.4.688-.569 1.004-.791 1.486-.812 1.662-.757 2.264.044.488 1.816 1.587 2.798 2.197.229.142.415.257.526.332.098.066.266.168.48.298 1.076.654 3.29 2 3.29 2.81 0 .97-3.078 3.507-4.05 4.137-.97.63-3.612 2.008-4.737 2.218-1.124.21-2.88-1.061-3.904-2.966-.963-1.791-.207-3.559.406-4.99l.115-.27c.559-1.322-.233-2.118-.772-2.658a9.377 9.377 0 01-.175-.18l-5.39-5.717c-.158-.167-.316-.32-.468-.468-.728-.707-1.346-1.308-1.346-2.842 0-1.855 7.189-10.536 7.189-10.536s6.066 1.157 6.884 1.157c.653 0 1.913-.433 3.227-.885.333-.114.669-.23 1-.34 1.635-.545 2.726-.549 2.726-.549s1.09.004 2.726.549c.33.11.667.226 1 .34 1.313.452 2.574.885 3.226.885zm-1.041 30.706c1.282.66 2.192 1.128 2.536 1.343.445.278.174.803-.232 1.09-.405.285-5.853 4.499-6.381 4.965l-.215.191c-.509.459-1.159 1.044-1.62 1.044-.46 0-1.11-.586-1.62-1.044l-.213-.191c-.53-.466-5.977-4.68-6.382-4.966-.405-.286-.677-.81-.232-1.09.344-.214 1.255-.683 2.539-1.344l1.22-.629c1.92-.992 4.315-1.837 4.689-1.837.373 0 2.767.844 4.689 1.837.436.226.845.437 1.222.63z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M43.34 6.334L37.751 0H18.12l-5.589 6.334s-4.908-1.362-7.225.953c0 0 6.544-.59 8.793 3.064 0 0 6.066 1.157 6.884 1.157.818 0 2.59-.68 4.226-1.225 1.636-.545 2.727-.549 2.727-.549s1.09.004 2.726.549 3.408 1.225 4.226 1.225c.818 0 6.885-1.157 6.885-1.157 2.249-3.654 8.792-3.064 8.792-3.064-2.317-2.315-7.225-.953-7.225-.953z" fill="url(#paint1_linear)"/><defs><linearGradient id="paint0_linear" x1=".671" y1="64.319" x2="55.2" y2="64.319" gradientUnits="userSpaceOnUse"><stop stop-color="#F50"/><stop offset=".41" stop-color="#F50"/><stop offset=".582" stop-color="#FF2000"/><stop offset="1" stop-color="#FF2000"/></linearGradient><linearGradient id="paint1_linear" x1="6.278" y1="11.466" x2="50.565" y2="11.466" gradientUnits="userSpaceOnUse"><stop stop-color="#FF452A"/><stop offset="1" stop-color="#FF2000"/></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,252 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="100%" viewBox="0 0 860 860" enable-background="new 0 0 860 860" xml:space="preserve">
<path fill="#292929" opacity="1.000000" stroke="none"
d="
M1.000000,801.000000
C1.000000,553.305298 1.000000,305.610596 1.447865,57.464870
C9.021611,57.017197 9.021502,57.017197 9.008190,50.123905
C9.004984,48.463673 9.103076,46.795834 8.977884,45.144890
C8.759684,42.267410 9.728286,40.654900 12.880814,40.994350
C15.748475,41.303127 17.370836,40.263092 17.017424,37.109661
C16.690794,34.195232 17.828167,32.667305 20.937605,33.009239
C23.874311,33.332176 25.358154,32.133648 25.012846,29.053125
C24.679403,26.078436 25.950268,24.639311 28.991241,25.019115
C32.059551,25.402332 33.315140,24.013861 33.000790,21.036680
C32.685429,18.049910 33.979393,17.014265 36.985378,16.846327
C38.364262,16.769293 40.823277,14.936883 40.775894,14.002795
C40.548393,9.517446 42.709217,8.565637 46.524349,8.964396
C48.330853,9.153214 50.195740,8.813924 51.995201,9.033412
C55.950733,9.515888 57.557449,7.907007 57.029888,3.985816
C56.898186,3.006922 57.003582,1.996130 57.000000,1.000000
C307.361359,1.000000 557.722717,1.000000 808.541992,1.432982
C809.122742,4.280973 809.245483,6.695983 809.362976,9.008148
C813.599365,9.008148 817.238525,9.127791 820.865662,8.970354
C823.776062,8.844029 825.346863,9.778153 825.001526,12.911630
C824.677917,15.848221 825.858765,17.351006 828.946777,17.013931
C831.936707,16.687565 833.333984,17.971933 832.981140,21.014172
C832.625488,24.080858 834.065613,25.326727 837.033142,24.998018
C840.104675,24.657778 841.268433,26.087555 841.026306,29.065149
C840.922302,30.344017 841.143127,31.649300 841.232544,33.227886
C845.844482,32.660969 850.147217,32.324524 849.231689,38.955315
C849.157532,39.492630 851.080994,40.951801 851.969910,40.867107
C856.441589,40.441048 857.419739,42.678406 857.038025,46.523270
C856.825378,48.664490 857.135559,50.854618 856.970215,53.004253
C856.736755,56.040195 857.974365,57.363819 861.000000,57.000000
C861.000000,304.694702 861.000000,552.389404 860.621704,800.543945
C857.403625,800.868652 856.452454,802.104553 856.789673,804.983093
C857.136536,807.943237 857.155212,810.989563 856.857361,813.951965
C856.750061,815.019348 855.199768,816.880920 854.489197,816.799438
C848.870483,816.154846 848.632080,819.500244 848.959900,823.568909
C849.106567,825.389160 848.883728,827.237305 848.993774,829.062805
C849.154419,831.728333 848.246155,833.281738 845.335022,832.964233
C842.144409,832.616150 840.601074,833.881653 840.993469,837.194885
C841.378479,840.445068 839.537415,840.999146 836.764954,841.120483
C835.497437,841.175964 833.151306,842.650330 833.223389,843.249023
C834.010864,849.790222 829.689697,849.115662 825.624512,848.989441
C823.794373,848.932617 821.857117,848.649597 820.162659,849.139954
C818.945374,849.492371 817.089966,851.043945 817.169006,851.909912
C817.628967,856.951416 814.720764,857.282898 810.982788,857.008972
C808.994751,856.863281 806.976318,857.122559 804.990173,856.965027
C801.952271,856.723938 800.616394,857.959473 801.000000,861.000000
C555.971985,861.000000 310.943939,861.000000 65.450897,860.582275
C64.481964,854.674500 60.212490,857.231384 57.690025,857.125244
C49.733109,856.790527 49.729267,857.007935 48.653473,849.756042
C48.611664,849.474243 48.275009,849.236206 48.073071,848.983643
C44.450493,848.989502 40.826706,848.886414 37.211929,849.022583
C34.395195,849.128662 32.642517,848.361450 33.015579,845.161682
C33.402672,841.841675 31.813314,840.623718 28.664013,840.959656
C25.768969,841.268433 24.775898,839.736450 25.035671,837.081299
C25.320675,834.168274 24.193420,832.611938 21.097826,832.982605
C17.646875,833.395874 16.958651,831.552490 16.885338,828.536987
C16.856565,827.353516 15.245986,825.138672 14.542875,825.211060
C9.047523,825.776855 8.670876,822.645142 8.964444,818.491760
C9.186049,815.356506 8.974668,812.190674 8.970829,808.589600
C9.004595,800.994568 9.004595,800.994568 1.968962,800.997864
C1.645974,800.997986 1.322987,800.999268 1.000000,801.000000
M608.933350,471.500000
C608.933350,435.749481 608.933350,399.998962 608.933350,364.305573
C590.312561,364.305573 572.246765,364.305573 553.859802,364.305573
C553.859802,374.998871 553.859802,385.394867 553.859802,395.799988
C553.388000,395.776947 553.151794,395.825500 553.107605,395.754517
C551.879761,393.782837 550.717102,391.769348 549.452393,389.822052
C542.164124,378.600494 532.516418,370.111542 519.790710,365.750763
C491.234344,355.965240 463.614746,358.823303 437.588074,373.772064
C392.542633,399.644501 371.803345,456.352783 388.010315,508.348907
C402.074707,553.470947 442.377899,586.893738 491.658600,584.948242
C512.362183,584.130859 531.029785,578.415283 544.786743,561.735901
C547.968872,557.877686 550.622864,553.583862 554.151245,548.598328
C554.151245,559.376282 554.151245,569.107178 554.151245,578.749390
C572.622498,578.749390 590.672913,578.749390 608.933350,578.749390
C608.933350,543.100403 608.933350,507.800201 608.933350,471.500000
M186.725815,448.639496
C185.095032,435.638611 185.630280,422.705841 188.093552,409.857544
C199.507690,350.321747 260.670502,319.435608 314.041229,346.620941
C322.785889,351.075165 330.389008,357.770538 339.007050,363.769287
C351.746277,353.230988 365.155701,342.138275 378.719788,330.917633
C365.901276,314.422089 350.770477,301.768341 331.838623,293.991302
C307.336548,283.926086 281.741791,282.166046 255.779266,285.023743
C220.415939,288.916168 190.031601,303.423645 165.711349,329.651978
C141.982681,355.242279 129.391678,385.832153 126.691292,420.462616
C123.035805,467.341705 136.343536,508.717072 170.157852,541.781677
C212.835724,583.513428 264.405853,592.425842 320.871307,578.153442
C344.869141,572.087646 363.858063,557.970764 379.037781,538.119202
C365.581299,526.302124 352.361572,514.692993 339.315430,503.236267
C338.720764,503.446747 338.535339,503.460754 338.425873,503.559204
C337.436554,504.448608 336.452179,505.343872 335.481812,506.253906
C312.983002,527.354553 286.219116,533.645691 256.471924,528.304443
C217.593079,521.323547 191.770508,488.878601 186.725815,448.639496
M647.744141,351.499847
C647.744141,427.082062 647.744141,502.664276 647.744141,578.382446
C666.304504,578.382446 684.343018,578.382446 702.442871,578.382446
C702.442871,477.804169 702.442871,377.593262 702.442871,277.290985
C684.107544,277.290985 666.040771,277.290985 647.744141,277.290985
C647.744141,301.890289 647.744141,326.195038 647.744141,351.499847
z"/>
<path fill="#000000" opacity="1.000000" stroke="none"
d="
M56.531342,1.000000
C57.003582,1.996130 56.898186,3.006922 57.029888,3.985816
C57.557449,7.907007 55.950733,9.515888 51.995201,9.033412
C50.195740,8.813924 48.330853,9.153214 46.524349,8.964396
C42.709217,8.565637 40.548393,9.517446 40.775894,14.002795
C40.823277,14.936883 38.364262,16.769293 36.985378,16.846327
C33.979393,17.014265 32.685429,18.049910 33.000790,21.036680
C33.315140,24.013861 32.059551,25.402332 28.991241,25.019115
C25.950268,24.639311 24.679403,26.078436 25.012846,29.053125
C25.358154,32.133648 23.874311,33.332176 20.937605,33.009239
C17.828167,32.667305 16.690794,34.195232 17.017424,37.109661
C17.370836,40.263092 15.748475,41.303127 12.880814,40.994350
C9.728286,40.654900 8.759684,42.267410 8.977884,45.144890
C9.103076,46.795834 9.004984,48.463673 9.008190,50.123905
C9.021502,57.017197 9.021611,57.017197 1.447865,57.006916
C1.000000,38.406548 1.000000,19.813091 1.000000,1.000000
C19.353643,1.000000 37.708164,1.000000 56.531342,1.000000
z"/>
<path fill="#000000" opacity="1.000000" stroke="none"
d="
M8.955997,809.038452
C8.974668,812.190674 9.186049,815.356506 8.964444,818.491760
C8.670876,822.645142 9.047523,825.776855 14.542875,825.211060
C15.245986,825.138672 16.856565,827.353516 16.885338,828.536987
C16.958651,831.552490 17.646875,833.395874 21.097826,832.982605
C24.193420,832.611938 25.320675,834.168274 25.035671,837.081299
C24.775898,839.736450 25.768969,841.268433 28.664013,840.959656
C31.813314,840.623718 33.402672,841.841675 33.015579,845.161682
C32.642517,848.361450 34.395195,849.128662 37.211929,849.022583
C40.826706,848.886414 44.450493,848.989502 48.073071,848.983643
C48.275009,849.236206 48.611664,849.474243 48.653473,849.756042
C49.729267,857.007935 49.733109,856.790527 57.690025,857.125244
C60.212490,857.231384 64.481964,854.674500 64.992950,860.582275
C43.747437,861.000000 22.494875,861.000000 1.000000,861.000000
C1.000000,843.979858 1.000000,826.958618 1.443019,809.468628
C4.242692,809.012817 6.599345,809.025635 8.955997,809.038452
z"/>
<path fill="#000000" opacity="1.000000" stroke="none"
d="
M861.000000,56.531342
C857.974365,57.363819 856.736755,56.040195 856.970215,53.004253
C857.135559,50.854618 856.825378,48.664490 857.038025,46.523270
C857.419739,42.678406 856.441589,40.441048 851.969910,40.867107
C851.080994,40.951801 849.157532,39.492630 849.231689,38.955315
C850.147217,32.324524 845.844482,32.660969 841.232544,33.227886
C841.143127,31.649300 840.922302,30.344017 841.026306,29.065149
C841.268433,26.087555 840.104675,24.657778 837.033142,24.998018
C834.065613,25.326727 832.625488,24.080858 832.981140,21.014172
C833.333984,17.971933 831.936707,16.687565 828.946777,17.013931
C825.858765,17.351006 824.677917,15.848221 825.001526,12.911630
C825.346863,9.778153 823.776062,8.844029 820.865662,8.970354
C817.238525,9.127791 813.599365,9.008148 809.362976,9.008148
C809.245483,6.695983 809.122742,4.280973 809.000000,1.432982
C826.262817,1.000000 843.525635,1.000000 861.000000,1.000000
C861.000000,19.353685 861.000000,37.708183 861.000000,56.531342
z"/>
<path fill="#000000" opacity="1.000000" stroke="none"
d="
M801.468628,861.000000
C800.616394,857.959473 801.952271,856.723938 804.990173,856.965027
C806.976318,857.122559 808.994751,856.863281 810.982788,857.008972
C814.720764,857.282898 817.628967,856.951416 817.169006,851.909912
C817.089966,851.043945 818.945374,849.492371 820.162659,849.139954
C821.857117,848.649597 823.794373,848.932617 825.624512,848.989441
C829.689697,849.115662 834.010864,849.790222 833.223389,843.249023
C833.151306,842.650330 835.497437,841.175964 836.764954,841.120483
C839.537415,840.999146 841.378479,840.445068 840.993469,837.194885
C840.601074,833.881653 842.144409,832.616150 845.335022,832.964233
C848.246155,833.281738 849.154419,831.728333 848.993774,829.062805
C848.883728,827.237305 849.106567,825.389160 848.959900,823.568909
C848.632080,819.500244 848.870483,816.154846 854.489197,816.799438
C855.199768,816.880920 856.750061,815.019348 856.857361,813.951965
C857.155212,810.989563 857.136536,807.943237 856.789673,804.983093
C856.452454,802.104553 857.403625,800.868652 860.621704,801.001892
C861.000000,820.926819 861.000000,840.853638 861.000000,861.000000
C841.312988,861.000000 821.625122,861.000000 801.468628,861.000000
z"/>
<path fill="#141414" opacity="1.000000" stroke="none"
d="
M8.970829,808.589600
C6.599345,809.025635 4.242692,809.012817 1.443019,809.000000
C1.000000,806.629456 1.000000,804.258850 1.000000,801.444153
C1.322987,800.999268 1.645974,800.997986 1.968962,800.997864
C9.004595,800.994568 9.004595,800.994568 8.970829,808.589600
z"/>
<path fill="#FEFEFE" opacity="1.000000" stroke="none"
d="
M608.933350,472.000000
C608.933350,507.800201 608.933350,543.100403 608.933350,578.749390
C590.672913,578.749390 572.622498,578.749390 554.151245,578.749390
C554.151245,569.107178 554.151245,559.376282 554.151245,548.598328
C550.622864,553.583862 547.968872,557.877686 544.786743,561.735901
C531.029785,578.415283 512.362183,584.130859 491.658600,584.948242
C442.377899,586.893738 402.074707,553.470947 388.010315,508.348907
C371.803345,456.352783 392.542633,399.644501 437.588074,373.772064
C463.614746,358.823303 491.234344,355.965240 519.790710,365.750763
C532.516418,370.111542 542.164124,378.600494 549.452393,389.822052
C550.717102,391.769348 551.879761,393.782837 553.107605,395.754517
C553.151794,395.825500 553.388000,395.776947 553.859802,395.799988
C553.859802,385.394867 553.859802,374.998871 553.859802,364.305573
C572.246765,364.305573 590.312561,364.305573 608.933350,364.305573
C608.933350,399.998962 608.933350,435.749481 608.933350,472.000000
M478.976898,413.286865
C453.431671,422.391785 438.543915,443.953400 438.711456,472.509064
C438.990021,519.981567 482.918488,547.278931 523.667114,527.373962
C551.094604,513.976135 562.997742,479.343994 551.664185,448.666687
C540.943726,419.648712 511.608704,405.134949 478.976898,413.286865
z"/>
<path fill="#FEFEFE" opacity="1.000000" stroke="none"
d="
M186.781860,449.083893
C191.770508,488.878601 217.593079,521.323547 256.471924,528.304443
C286.219116,533.645691 312.983002,527.354553 335.481812,506.253906
C336.452179,505.343872 337.436554,504.448608 338.425873,503.559204
C338.535339,503.460754 338.720764,503.446747 339.315430,503.236267
C352.361572,514.692993 365.581299,526.302124 379.037781,538.119202
C363.858063,557.970764 344.869141,572.087646 320.871307,578.153442
C264.405853,592.425842 212.835724,583.513428 170.157852,541.781677
C136.343536,508.717072 123.035805,467.341705 126.691292,420.462616
C129.391678,385.832153 141.982681,355.242279 165.711349,329.651978
C190.031601,303.423645 220.415939,288.916168 255.779266,285.023743
C281.741791,282.166046 307.336548,283.926086 331.838623,293.991302
C350.770477,301.768341 365.901276,314.422089 378.719788,330.917633
C365.155701,342.138275 351.746277,353.230988 339.007050,363.769287
C330.389008,357.770538 322.785889,351.075165 314.041229,346.620941
C260.670502,319.435608 199.507690,350.321747 188.093552,409.857544
C185.630280,422.705841 185.095032,435.638611 186.781860,449.083893
z"/>
<path fill="#FDFDFD" opacity="1.000000" stroke="none"
d="
M647.744141,350.999817
C647.744141,326.195038 647.744141,301.890289 647.744141,277.290985
C666.040771,277.290985 684.107544,277.290985 702.442871,277.290985
C702.442871,377.593262 702.442871,477.804169 702.442871,578.382446
C684.343018,578.382446 666.304504,578.382446 647.744141,578.382446
C647.744141,502.664276 647.744141,427.082062 647.744141,350.999817
z"/>
<path fill="#2A2A2A" opacity="1.000000" stroke="none"
d="
M479.370300,413.190063
C511.608704,405.134949 540.943726,419.648712 551.664185,448.666687
C562.997742,479.343994 551.094604,513.976135 523.667114,527.373962
C482.918488,547.278931 438.990021,519.981567 438.711456,472.509064
C438.543915,443.953400 453.431671,422.391785 479.370300,413.190063
z"/>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient x1="0%" y1="68.01%" x2="100%" y2="68.01%" id="a"><stop stop-color="#8930FD" offset="0%"/><stop stop-color="#49CCF9" offset="100%"/></linearGradient><linearGradient x1="0%" y1="68.01%" x2="100%" y2="68.01%" id="b"><stop stop-color="#FF02F0" offset="0%"/><stop stop-color="#FFC800" offset="100%"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><path fill="#FFF" d="M0 0h90v90H0z"/><g fill-rule="nonzero"><path d="m.166 49.48 9.89-7.576c5.255 6.858 10.838 10.02 17.052 10.02 6.18 0 11.606-3.125 16.624-9.929l10.031 7.394c-7.24 9.812-16.237 14.996-26.655 14.996-10.385 0-19.47-5.151-26.942-14.904Z" fill="url(#a)" transform="translate(18 13)"/><path fill="url(#b)" d="M27.075 16.549 9.47 31.719 1.333 22.28 27.113.066l25.574 22.232-8.174 9.404z" transform="translate(18 13)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 880 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="24" height="24"><path d="M8.16 23h21.177v-5.86l-4.023-2.307-.694-.3-16.46.113z" fill="#fff"/><path d="M22.012 22.222c.197-.675.122-1.294-.206-1.754-.3-.422-.807-.666-1.416-.694l-11.545-.15c-.075 0-.14-.038-.178-.094s-.047-.13-.028-.206c.038-.113.15-.197.272-.206l11.648-.15c1.38-.066 2.88-1.182 3.404-2.55l.666-1.735a.38.38 0 0 0 .02-.225c-.75-3.395-3.78-5.927-7.4-5.927-3.34 0-6.17 2.157-7.184 5.15-.657-.488-1.5-.75-2.392-.666-1.604.16-2.9 1.444-3.048 3.048a3.58 3.58 0 0 0 .084 1.191A4.84 4.84 0 0 0 0 22.1c0 .234.02.47.047.703.02.113.113.197.225.197H21.58a.29.29 0 0 0 .272-.206l.16-.572z" fill="#f38020"/><path d="M25.688 14.803l-.32.01c-.075 0-.14.056-.17.13l-.45 1.566c-.197.675-.122 1.294.206 1.754.3.422.807.666 1.416.694l2.457.15c.075 0 .14.038.178.094s.047.14.028.206c-.038.113-.15.197-.272.206l-2.56.15c-1.388.066-2.88 1.182-3.404 2.55l-.188.478c-.038.094.028.188.13.188h8.797a.23.23 0 0 0 .225-.169A6.41 6.41 0 0 0 32 21.106a6.32 6.32 0 0 0-6.312-6.302" fill="#faae40"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,12 @@
<svg width="24" height="24" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g clip-path="url(#clip0)">
<path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z" fill="#5865F2">
</path>
</g>
<defs>
<clipPath id="clip0">
<rect width="71" height="55" fill="white">
</rect>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" id="svg126" version="1.1" viewBox="-35.3175 -50 306.085 300"><defs id="defs112"><style id="style110">.cls-1{fill:#0061ff}</style></defs><path id="polygon116" class="cls-1" d="M58.86 75l58.87-37.5L58.86 0 0 37.5z"/><path id="polygon118" class="cls-1" d="M176.59 75l58.86-37.5L176.59 0l-58.86 37.5z"/><path id="polygon120" class="cls-1" d="M117.73 112.5L58.86 75 0 112.5 58.86 150z"/><path id="polygon122" class="cls-1" d="M176.59 150l58.86-37.5L176.59 75l-58.86 37.5z"/><path id="polygon124" class="cls-1" d="M176.59 162.5L117.73 125l-58.87 37.5 58.87 37.5z"/></svg>

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="24px" height="24px"><path fill="#7b1fa2" d="M38,44H12c-2.209,0-4-1.791-4-4V8c0-2.209,1.791-4,4-4h18l12,12v24C42,42.209,40.209,44,38,44z"/><path fill="#b39ddb" d="M30,4l12,12H30V4z"/><circle cx="17" cy="22" r="2" fill="#fff"/><circle cx="17" cy="28" r="2" fill="#fff"/><circle cx="17" cy="34" r="2" fill="#fff"/><rect x="22" y="21" width="12" height="2" fill="#fff"/><rect x="22" y="27" width="12" height="2" fill="#fff"/><rect x="22" y="33" width="12" height="2" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 550 B

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="24" height="24">
<path style="fill:#FF7B57;" d="M447.931,194.997c-17.705-13.524-38.519-22.393-60.536-25.796h0.095v-60.718 c16.405-7.662,26.92-24.098,27-42.204v-1.419c-0.069-25.805-20.972-46.708-46.777-46.777h-1.419 c-25.806,0.069-46.708,20.972-46.777,46.777v1.419c0.08,18.106,10.595,34.542,27,42.204v60.845 c-23.106,3.533-44.869,13.109-63.084,27.757L116.448,67.036c7.593-28.426-9.297-57.625-37.723-65.218 C50.299-5.775,21.1,11.114,13.507,39.54c-7.593,28.426,9.296,57.625,37.723,65.218c13.592,3.63,28.067,1.738,40.268-5.266 l164.177,127.809c-30.264,45.659-29.451,105.2,2.05,150.014l-49.963,49.963c-4.011-1.277-8.187-1.958-12.396-2.019 c-23.953,0-43.37,19.417-43.37,43.37S171.413,512,195.366,512c23.953,0,43.37-19.418,43.37-43.371 c-0.059-4.208-0.739-8.386-2.019-12.396l49.427-49.426c58.49,44.676,142.122,33.478,186.799-25.012 C517.619,323.305,506.421,239.673,447.931,194.997z M367.082,369.272l-0.158-0.032c-37.767-0.087-68.313-30.774-68.225-68.541 c0.087-37.767,30.774-68.312,68.541-68.226c37.718,0.087,68.243,30.697,68.226,68.415 C435.465,338.656,404.849,369.272,367.082,369.272z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,4 @@
<svg width="232" height="228" viewBox="0 0 232 228" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path d="M198.821 125.463C198.821 127.496 198.02 129.445 196.594 130.882C195.168 132.319 193.235 133.127 191.218 133.127C189.202 133.127 187.268 132.319 185.842 130.882C184.416 129.445 183.615 127.496 183.615 125.463V57.0003C183.615 54.9679 184.416 53.0187 185.842 51.5816C187.268 50.1444 189.202 49.337 191.218 49.337C193.235 49.337 195.168 50.1444 196.594 51.5816C198.02 53.0187 198.821 54.9679 198.821 57.0003V125.463ZM196.182 172.9C195.177 173.913 166.902 197.663 115.064 197.663C63.227 197.663 35.1406 174.04 33.9467 173.026C33.1944 172.387 32.5747 171.604 32.1231 170.723C31.6716 169.841 31.3971 168.879 31.3153 167.89C31.2336 166.902 31.3463 165.907 31.6469 164.962C31.9475 164.018 32.4301 163.142 33.0671 162.386V162.386C34.3793 160.856 36.2386 159.911 38.2396 159.756C40.2406 159.602 42.2209 160.252 43.7487 161.563C44.1886 161.88 69.4475 182.526 115.002 182.526C160.556 182.526 186.003 161.753 186.254 161.563C187.799 160.263 189.786 159.622 191.792 159.776C193.799 159.93 195.667 160.866 196.999 162.386C198.281 163.894 198.921 165.851 198.779 167.831C198.638 169.811 197.727 171.656 196.245 172.963L196.182 172.9ZM31.2449 57.0003C31.3585 54.9615 32.2683 53.0508 33.7754 51.6861C35.2824 50.3213 37.2642 49.6134 39.2876 49.717C41.1633 49.8244 42.9332 50.628 44.2559 51.9729C45.5786 53.3178 46.3604 55.1088 46.4505 57.0003V125.337C46.4505 127.369 45.6495 129.318 44.2237 130.755C42.7979 132.193 40.8641 133 38.8477 133C36.8313 133 34.8975 132.193 33.4717 130.755C32.0459 129.318 31.2449 127.369 31.2449 125.337V57.0003ZM69.3847 41.8004C69.4983 39.7615 70.4081 37.8509 71.9151 36.4862C73.4222 35.1214 75.404 34.4135 77.4273 34.5171C79.3031 34.6245 81.073 35.4281 82.3957 36.773C83.7183 38.1179 84.5001 39.9088 84.5903 41.8004V143.133C84.5903 145.166 83.7893 147.115 82.3635 148.552C80.9377 149.989 79.0039 150.796 76.9875 150.796C74.9711 150.796 73.0373 149.989 71.6115 148.552C70.1857 147.115 69.3847 145.166 69.3847 143.133V41.8004ZM107.713 38.0004C107.713 35.968 108.514 34.0188 109.94 32.5817C111.366 31.1445 113.299 30.3371 115.316 30.3371C117.332 30.3371 119.266 31.1445 120.692 32.5817C122.118 34.0188 122.919 35.968 122.919 38.0004V148.2C122.919 150.232 122.118 152.181 120.692 153.619C119.266 155.056 117.332 155.863 115.316 155.863C113.299 155.863 111.366 155.056 109.94 153.619C108.514 152.181 107.713 150.232 107.713 148.2V38.0004ZM145.413 41.8004C145.413 39.768 146.214 37.8188 147.64 36.3816C149.065 34.9445 150.999 34.1371 153.016 34.1371C155.032 34.1371 156.966 34.9445 158.392 36.3816C159.817 37.8188 160.618 39.768 160.618 41.8004V143.133C160.618 145.166 159.817 147.115 158.392 148.552C156.966 149.989 155.032 150.796 153.016 150.796C150.999 150.796 149.065 149.989 147.64 148.552C146.214 147.115 145.413 145.166 145.413 143.133V41.8004ZM200.895 0.00063243H29.4856C25.7507 -0.024391 22.0476 0.693392 18.5883 2.11288C15.1289 3.53237 11.9814 5.6257 9.32581 8.27299C6.67023 10.9203 4.55877 14.0695 3.11235 17.5405C1.66592 21.0114 0.912928 24.7358 0.896484 28.5005L0.896484 199.5C0.912928 203.264 1.66592 206.989 3.11235 210.46C4.55877 213.93 6.67023 217.08 9.32581 219.727C11.9814 222.374 15.1289 224.468 18.5883 225.887C22.0476 227.307 25.7507 228.024 29.4856 227.999H200.895C204.624 228.024 208.322 227.309 211.777 225.893C215.233 224.478 218.377 222.39 221.032 219.749C223.687 217.109 225.8 213.967 227.25 210.503C228.7 207.04 229.459 203.322 229.484 199.563V199.563V28.5005C229.467 24.7412 228.716 21.022 227.274 17.5552C225.831 14.0884 223.725 10.942 221.076 8.29549C218.428 5.64903 215.287 3.55438 211.835 2.13115C208.383 0.707912 204.687 -0.0160384 200.957 0.00063243V0.00063243" fill="#081D34">
</path>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2228.833 2073.333">
<path fill="#5059C9" d="M1554.637,777.5h575.713c54.391,0,98.483,44.092,98.483,98.483c0,0,0,0,0,0v524.398 c0,199.901-162.051,361.952-361.952,361.952h0h-1.711c-199.901,0.028-361.975-162-362.004-361.901c0-0.017,0-0.034,0-0.052V828.971 C1503.167,800.544,1526.211,777.5,1554.637,777.5L1554.637,777.5z"/>
<circle fill="#5059C9" cx="1943.75" cy="440.583" r="233.25"/>
<circle fill="#7B83EB" cx="1218.083" cy="336.917" r="336.917"/>
<path fill="#7B83EB" d="M1667.323,777.5H717.01c-53.743,1.33-96.257,45.931-95.01,99.676v598.105 c-7.505,322.519,247.657,590.16,570.167,598.053c322.51-7.893,577.671-275.534,570.167-598.053V877.176 C1763.579,823.431,1721.066,778.83,1667.323,777.5z"/>
<path opacity=".1" d="M1244,777.5v838.145c-0.258,38.435-23.549,72.964-59.09,87.598 c-11.316,4.787-23.478,7.254-35.765,7.257H667.613c-6.738-17.105-12.958-34.21-18.142-51.833 c-18.144-59.477-27.402-121.307-27.472-183.49V877.02c-1.246-53.659,41.198-98.19,94.855-99.52H1244z"/>
<path opacity=".2" d="M1192.167,777.5v889.978c-0.002,12.287-2.47,24.449-7.257,35.765 c-14.634,35.541-49.163,58.833-87.598,59.09H691.975c-8.812-17.105-17.105-34.21-24.362-51.833 c-7.257-17.623-12.958-34.21-18.142-51.833c-18.144-59.476-27.402-121.307-27.472-183.49V877.02 c-1.246-53.659,41.198-98.19,94.855-99.52H1192.167z"/>
<path opacity=".2" d="M1192.167,777.5v786.312c-0.395,52.223-42.632,94.46-94.855,94.855h-447.84 c-18.144-59.476-27.402-121.307-27.472-183.49V877.02c-1.246-53.659,41.198-98.19,94.855-99.52H1192.167z"/>
<path opacity=".2" d="M1140.333,777.5v786.312c-0.395,52.223-42.632,94.46-94.855,94.855H649.472 c-18.144-59.476-27.402-121.307-27.472-183.49V877.02c-1.246-53.659,41.198-98.19,94.855-99.52H1140.333z"/>
<path opacity=".1" d="M1244,509.522v163.275c-8.812,0.518-17.105,1.037-25.917,1.037 c-8.812,0-17.105-0.518-25.917-1.037c-17.496-1.161-34.848-3.937-51.833-8.293c-104.963-24.857-191.679-98.469-233.25-198.003 c-7.153-16.715-12.706-34.071-16.587-51.833h258.648C1201.449,414.866,1243.801,457.217,1244,509.522z"/>
<path opacity=".2" d="M1192.167,561.355v111.442c-17.496-1.161-34.848-3.937-51.833-8.293 c-104.963-24.857-191.679-98.469-233.25-198.003h190.228C1149.616,466.699,1191.968,509.051,1192.167,561.355z"/>
<path opacity=".2" d="M1192.167,561.355v111.442c-17.496-1.161-34.848-3.937-51.833-8.293 c-104.963-24.857-191.679-98.469-233.25-198.003h190.228C1149.616,466.699,1191.968,509.051,1192.167,561.355z"/>
<path opacity=".2" d="M1140.333,561.355v103.148c-104.963-24.857-191.679-98.469-233.25-198.003 h138.395C1097.783,466.699,1140.134,509.051,1140.333,561.355z"/>
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="198.099" y1="1683.0726" x2="942.2344" y2="394.2607" gradientTransform="matrix(1 0 0 -1 0 2075.3333)">
<stop offset="0" stop-color="#5a62c3"/>
<stop offset=".5" stop-color="#4d55bd"/>
<stop offset="1" stop-color="#3940ab"/>
</linearGradient>
<path fill="url(#a)" d="M95.01,466.5h950.312c52.473,0,95.01,42.538,95.01,95.01v950.312c0,52.473-42.538,95.01-95.01,95.01 H95.01c-52.473,0-95.01-42.538-95.01-95.01V561.51C0,509.038,42.538,466.5,95.01,466.5z"/>
<path fill="#FFF" d="M820.211,828.193H630.241v517.297H509.211V828.193H320.123V727.844h500.088V828.193z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,23 @@
<svg version="1.1" id="Layer_1" xmlns:x="ns_extend;" xmlns:i="ns_ai;" xmlns:graph="ns_graphs;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 49.64 47.36" style="enable-background:new 0 0 49.64 47.36;" xml:space="preserve">
<style type="text/css">
.st0{fill:#7856FF;}
</style>
<metadata>
<sfw xmlns="ns_sfw;">
<slices>
</slices>
<sliceSourceBounds bottomLeftOrigin="true" height="47.36" width="49.64" x="102.59" y="19.73">
</sliceSourceBounds>
</sfw>
</metadata>
<g>
<path class="st0" d="M14.41,19.54h6.31c-1.58-0.99-2.17-2.37-2.96-4.93l-2.37-8.78c-1.08-3.95-1.97-5.82-6.31-5.82H0.01v2.37H1.3
c2.66,0,2.96,0.99,3.75,3.95l2.07,7.7C8.2,17.77,9.89,19.54,14.41,19.54L14.41,19.54z M29.02,19.54h6.31c4.54,0,6.11-1.78,7.2-5.52
l2.07-7.7c0.79-2.96,1.18-3.95,3.75-3.95h1.29V0h-8.98c-4.44,0-5.33,1.78-6.32,5.82l-2.37,8.78
C31.19,17.26,30.59,18.55,29.02,19.54z M20.73,27.82h8.29v-8.29h-8.29V27.82z M0.01,47.36h9.07c4.34,0,5.23-1.88,6.31-5.82
l2.37-8.78c0.79-2.56,1.38-3.95,2.96-4.93h-6.31c-4.54,0-6.22,1.78-7.3,5.52l-2.07,7.7C4.25,44.01,3.96,45,1.29,45H0L0.01,47.36
L0.01,47.36z M40.65,47.36h8.98v-2.37h-1.29c-2.56,0-2.96-0.99-3.75-3.95l-2.07-7.7c-1.08-3.75-2.66-5.52-7.2-5.52h-6.3
c1.58,0.99,2.15,2.27,2.94,4.93l2.37,8.78C35.32,45.58,36.21,47.36,40.65,47.36L40.65,47.36z">
</path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 -50 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M31.8458633,153.488694 C20.3244423,153.513586 9.68073708,147.337265 3.98575204,137.321731 C-1.62714067,127.367831 -1.29055839,115.129325 4.86093879,105.498969 L62.2342919,15.4033556 C68.2125882,5.54538256 79.032489,-0.333585033 90.5563073,0.0146553508 C102.071737,0.290611552 112.546041,6.74705604 117.96667,16.9106216 C123.315033,27.0238906 122.646488,39.1914174 116.240607,48.6847625 L58.9037201,138.780375 C52.9943022,147.988884 42.7873202,153.537154 31.8458633,153.488694 L31.8458633,153.488694 Z" fill="#F62B54"></path>
<path d="M130.25575,153.488484 C118.683837,153.488484 108.035731,147.301291 102.444261,137.358197 C96.8438154,127.431292 97.1804475,115.223704 103.319447,105.620522 L160.583402,15.7315506 C166.47539,5.73210989 177.327374,-0.284878136 188.929728,0.0146553508 C200.598885,0.269918151 211.174058,6.7973526 216.522421,17.0078646 C221.834319,27.2183766 221.056375,39.4588356 214.456008,48.9278699 L157.204209,138.816842 C151.313487,147.985468 141.153618,153.5168 130.25575,153.488484 Z" fill="#FFCC00"></path>
<ellipse fill="#00CA72" cx="226.465527" cy="125.324379" rx="29.5375538" ry="28.9176274"></ellipse>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 5.5 32 20.5"><title>OfficeCore10_32x_24x_20x_16x_01-22-2019</title><g id="STYLE_COLOR"><path d="M12.20245,11.19292l.00031-.0011,6.71765,4.02379,4.00293-1.68451.00018.00068A6.4768,6.4768,0,0,1,25.5,13c.14764,0,.29358.0067.43878.01639a10.00075,10.00075,0,0,0-18.041-3.01381C7.932,10.00215,7.9657,10,8,10A7.96073,7.96073,0,0,1,12.20245,11.19292Z" fill="#0364b8"/><path d="M12.20276,11.19182l-.00031.0011A7.96073,7.96073,0,0,0,8,10c-.0343,0-.06805.00215-.10223.00258A7.99676,7.99676,0,0,0,1.43732,22.57277l5.924-2.49292,2.63342-1.10819,5.86353-2.46746,3.06213-1.28859Z" fill="#0078d4"/><path d="M25.93878,13.01639C25.79358,13.0067,25.64764,13,25.5,13a6.4768,6.4768,0,0,0-2.57648.53178l-.00018-.00068-4.00293,1.68451,1.16077.69528L23.88611,18.19l1.66009.99438,5.67633,3.40007a6.5002,6.5002,0,0,0-5.28375-9.56805Z" fill="#1490df"/><path d="M25.5462,19.18437,23.88611,18.19l-3.80493-2.2791-1.16077-.69528L15.85828,16.5042,9.99475,18.97166,7.36133,20.07985l-5.924,2.49292A7.98889,7.98889,0,0,0,8,26H25.5a6.49837,6.49837,0,0,0,5.72253-3.41556Z" fill="#28a8ea"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="24px" height="24px"><path fill="#03A9F4" d="M21,31c0,1.104,0.896,2,2,2h17c1.104,0,2-0.896,2-2V16c0-1.104-0.896-2-2-2H23c-1.104,0-2,0.896-2,2V31z"/><path fill="#B3E5FC" d="M42,16.975V16c0-0.428-0.137-0.823-0.367-1.148l-11.264,6.932l-7.542-4.656L22.125,19l8.459,5L42,16.975z"/><path fill="#0277BD" d="M27 41.46L6 37.46 6 9.46 27 5.46z"/><path fill="#FFF" d="M21.216,18.311c-1.098-1.275-2.546-1.913-4.328-1.913c-1.892,0-3.408,0.669-4.554,2.003c-1.144,1.337-1.719,3.088-1.719,5.246c0,2.045,0.564,3.714,1.69,4.986c1.126,1.273,2.592,1.91,4.378,1.91c1.84,0,3.331-0.652,4.474-1.975c1.143-1.313,1.712-3.043,1.712-5.199C22.869,21.281,22.318,19.595,21.216,18.311z M19.049,26.735c-0.568,0.769-1.339,1.152-2.313,1.152c-0.939,0-1.699-0.394-2.285-1.187c-0.581-0.785-0.87-1.861-0.87-3.211c0-1.336,0.289-2.414,0.87-3.225c0.586-0.81,1.368-1.211,2.355-1.211c0.962,0,1.718,0.393,2.267,1.178c0.555,0.795,0.833,1.895,0.833,3.31C19.907,24.906,19.618,25.968,19.049,26.735z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M186 447.471V154H318.062C336.788 154 353.697 158.053 368.79 166.158C384.163 174.263 396.181 185.443 404.845 199.698C413.51 213.672 417.842 229.604 417.842 247.491C417.842 265.938 413.51 282.568 404.845 297.381C396.181 311.915 384.302 323.375 369.209 331.759C354.117 340.144 337.067 344.337 318.062 344.337H253.917V447.471H186ZM348.667 447.471L274.041 314.99L346.99 304.509L430 447.471H348.667ZM253.917 289.835H311.773C319.04 289.835 325.329 288.298 330.639 285.223C336.229 281.869 340.421 277.258 343.216 271.388C346.291 265.519 347.828 258.811 347.828 251.265C347.828 243.718 346.151 237.15 342.797 231.56C339.443 225.691 334.552 221.219 328.124 218.144C321.975 215.07 314.428 213.533 305.484 213.533H253.917V289.835Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 849 B

View File

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><defs><style>.cls-1{fill:#8db948;}.cls-2{fill:#5c863e;}.cls-3{fill:#fff;}</style></defs><path class="cls-1" d="M480.51,233.35c4.11,0,6.16,2.05,10.26,4.11-24.62,10.25-49.23,36.92-61.54,94.35L384.1,344.12C398.46,303.1,427.18,233.35,480.51,233.35Zm22.57,20.52a143.05,143.05,0,0,1,8.2,49.23v4.1L451.8,323.61C464.1,280.53,484.62,262.07,503.08,253.87Zm53.33,36.92L529.74,299v-6.15c0-18.46-2-32.82-6.15-45.13C538,251.81,550.26,270.28,556.41,290.79Zm133.33,32.82a4.41,4.41,0,0,0-4.1-4.1c-4.1,0-47.18-4.11-47.18-4.11s-30.77-30.77-34.87-32.82c-4.1-4.1-10.26-2.05-12.31-2.05,0,0-6.15,2.05-16.41,6.16C564.61,258,546.15,231.3,515.38,231.3h-2a36.26,36.26,0,0,0-30.77-16.41c-73.84-2-108.71,90.26-121,137.44-16.41,4.1-32.82,10.25-51.28,16.41-16.41,4.1-16.41,6.15-18.46,20.51-2.05,10.26-43.08,334.35-43.08,334.35l326.15,61.54,176.41-39S689.74,327.71,689.74,323.61Z"/><path class="cls-2" d="M683.59,319.51c-2.05,0-45.13-4.11-45.13-4.11s-30.77-30.77-34.87-32.82c-2.05-2.05-2.05-2.05-4.1-2.05L574.87,785.14l176.41-39s-61.54-418.46-61.54-422.56c0-2.05-4.1-4.1-6.15-4.1"/><path class="cls-3" d="M515.38,418l-22.56,65.64a97.24,97.24,0,0,0-43.08-10.26c-34.87,0-36.92,20.51-36.92,26.67,0,28.71,77.95,41,77.95,110.76,0,55.39-34.87,90.26-82,90.26-55.39,0-84.1-34.87-84.1-34.87L339,616.94s28.71,24.61,53.33,24.61c16.41,0,22.56-12.3,22.56-22.56,0-39-63.59-41-63.59-104.61,0-53.34,39-104.62,114.87-104.62C501,407.71,515.38,418,515.38,418"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="24" height="24" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<circle cx="512" cy="512" r="512" style="fill:#635bff"/>
<path d="M781.67 515.75c0-38.35-18.58-68.62-54.08-68.62s-57.23 30.26-57.23 68.32c0 45.09 25.47 67.87 62 67.87 17.83 0 31.31-4 41.5-9.74v-30c-10.19 5.09-21.87 8.24-36.7 8.24-14.53 0-27.42-5.09-29.06-22.77h73.26c.01-1.92.31-9.71.31-13.3zm-74-14.23c0-16.93 10.34-24 19.78-24 9.14 0 18.88 7 18.88 24zm-95.14-54.39a42.32 42.32 0 0 0-29.36 11.69l-1.95-9.29h-33v174.68l37.45-7.94.15-42.4c5.39 3.9 13.33 9.44 26.52 9.44 26.82 0 51.24-21.57 51.24-69.06-.12-43.45-24.84-67.12-51.05-67.12zm-9 103.22c-8.84 0-14.08-3.15-17.68-7l-.15-55.58c3.9-4.34 9.29-7.34 17.83-7.34 13.63 0 23.07 15.28 23.07 34.91.01 20.03-9.28 35.01-23.06 35.01zM496.72 438.29l37.6-8.09v-30.41l-37.6 7.94v30.56zm0 11.39h37.6v131.09h-37.6zm-40.3 11.08L454 449.68h-32.34v131.08h37.45v-88.84c8.84-11.54 23.82-9.44 28.46-7.79v-34.45c-4.78-1.8-22.31-5.1-31.15 11.08zm-74.91-43.59L345 425l-.15 120c0 22.17 16.63 38.5 38.8 38.5 12.28 0 21.27-2.25 26.22-4.94v-30.45c-4.79 1.95-28.46 8.84-28.46-13.33v-53.19h28.46v-31.91h-28.51zm-101.27 70.56c0-5.84 4.79-8.09 12.73-8.09a83.56 83.56 0 0 1 37.15 9.59V454a98.8 98.8 0 0 0-37.12-6.87c-30.41 0-50.64 15.88-50.64 42.4 0 41.35 56.93 34.76 56.93 52.58 0 6.89-6 9.14-14.38 9.14-12.43 0-28.32-5.09-40.9-12v35.66a103.85 103.85 0 0 0 40.9 8.54c31.16 0 52.58-15.43 52.58-42.25-.17-44.63-57.25-36.69-57.25-53.47z" style="fill:#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,15 @@
<svg width="24" height="24" viewBox="0 0 109 113" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M63.7076 110.284C60.8481 113.885 55.0502 111.912 54.9813 107.314L53.9738 40.0627L99.1935 40.0627C107.384 40.0627 111.952 49.5228 106.859 55.9374L63.7076 110.284Z" fill="url(#paint0_linear)"/>
<path d="M63.7076 110.284C60.8481 113.885 55.0502 111.912 54.9813 107.314L53.9738 40.0627L99.1935 40.0627C107.384 40.0627 111.952 49.5228 106.859 55.9374L63.7076 110.284Z" fill="url(#paint1_linear)" fill-opacity="0.2"/>
<path d="M45.317 2.07103C48.1765 -1.53037 53.9745 0.442937 54.0434 5.041L54.4849 72.2922H9.83113C1.64038 72.2922 -2.92775 62.8321 2.1655 56.4175L45.317 2.07103Z" fill="#3ECF8E"/>
<defs>
<linearGradient id="paint0_linear" x1="53.9738" y1="54.974" x2="94.1635" y2="71.8295" gradientUnits="userSpaceOnUse">
<stop stop-color="#249361"/>
<stop offset="1" stop-color="#3ECF8E"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="36.1558" y1="30.578" x2="54.4844" y2="65.0806" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,3 @@
<svg width="1155" height="1000" viewBox="0 0 1155 1000" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M577.344 0L1154.69 1000H0L577.344 0Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 122.52 122.523" xmlns="http://www.w3.org/2000/svg"><g fill="#464342"><path d="m8.708 61.26c0 20.802 12.089 38.779 29.619 47.298l-25.069-68.686c-2.916 6.536-4.55 13.769-4.55 21.388z"/><path d="m96.74 58.608c0-6.495-2.333-10.993-4.334-14.494-2.664-4.329-5.161-7.995-5.161-12.324 0-4.831 3.664-9.328 8.825-9.328.233 0 .454.029.681.042-9.35-8.566-21.807-13.796-35.489-13.796-18.36 0-34.513 9.42-43.91 23.688 1.233.037 2.395.063 3.382.063 5.497 0 14.006-.667 14.006-.667 2.833-.167 3.167 3.994.337 4.329 0 0-2.847.335-6.015.501l19.138 56.925 11.501-34.493-8.188-22.434c-2.83-.166-5.511-.501-5.511-.501-2.832-.166-2.5-4.496.332-4.329 0 0 8.679.667 13.843.667 5.496 0 14.006-.667 14.006-.667 2.835-.167 3.168 3.994.337 4.329 0 0-2.853.335-6.015.501l18.992 56.494 5.242-17.517c2.272-7.269 4.001-12.49 4.001-16.989z"/><path d="m62.184 65.857-15.768 45.819c4.708 1.384 9.687 2.141 14.846 2.141 6.12 0 11.989-1.058 17.452-2.979-.141-.225-.269-.464-.374-.724z"/><path d="m107.376 36.046c.226 1.674.354 3.471.354 5.404 0 5.333-.996 11.328-3.996 18.824l-16.053 46.413c15.624-9.111 26.133-26.038 26.133-45.426.001-9.137-2.333-17.729-6.438-25.215z"/><path d="m61.262 0c-33.779 0-61.262 27.481-61.262 61.26 0 33.783 27.483 61.263 61.262 61.263 33.778 0 61.265-27.48 61.265-61.263-.001-33.779-27.487-61.26-61.265-61.26zm0 119.715c-32.23 0-58.453-26.223-58.453-58.455 0-32.23 26.222-58.451 58.453-58.451 32.229 0 58.45 26.221 58.45 58.451 0 32.232-26.221 58.455-58.45 58.455z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,25 @@
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg2" xml:space="preserve" width="24" height="24" viewBox="0 0 234.66667 165.33333" xmlns:xlink="http://www.w3.org/1999/xlink">
<metadata id="metadata8">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>
image/svg+xml
</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage">
</dc:type>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs6">
</defs>
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview4">
</sodipodi:namedview>
<g id="g10" inkscape:groupmode="layer" inkscape:label="ink_ext_XXXXXX" transform="matrix(1.3333333,0,0,-1.3333333,0,165.33333)">
<g id="g12" transform="scale(0.1)">
<path d="m 1723.22,1046.37 c -20.24,76.22 -79.87,136.24 -155.6,156.61 C 1430.37,1240 880,1240 880,1240 c 0,0 -550.367,0 -687.621,-37.02 C 116.656,1182.61 57.0156,1122.59 36.7773,1046.37 0,908.227 0,620 0,620 0,620 0,331.777 36.7773,193.621 57.0156,117.41 116.656,57.3906 192.379,37.0117 329.633,0 880,0 880,0 c 0,0 550.37,0 687.62,37.0117 75.73,20.3789 135.36,80.3983 155.6,156.6093 C 1760,331.777 1760,620 1760,620 c 0,0 0,288.227 -36.78,426.37" style="fill:#ed1d24;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path14">
</path>
<path d="m 700,358.313 460,261.675 -460,261.7 z" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path16">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 1393 1055.77" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M643.51 278.74v777H0zm0-278.74c0 177.57-143.84 321.41-321.41 321.41S0 177.57 0 0zm106 1055.77c0-177.57 143.84-321.41 321.41-321.41s321.41 143.84 321.41 321.41zm0-278.74V0H1393z" fill="#03363d"/></svg>

After

Width:  |  Height:  |  Size: 300 B

View File

@@ -51,7 +51,7 @@ export const ApiKeyDialog: FC<ApiKeyDialogProps> = ({
},
})
// biome-ignore lint/correctness/useExhaustiveDependencies: We only want to reset the form when the dialog is closed, not on every render
// biome-ignore lint/correctness/useExhaustiveDependencies: reset form when dialog closes
useEffect(() => {
if (!open) form.reset()
}, [open])

View File

@@ -1,8 +1,17 @@
import { Server } from 'lucide-react'
import type { FC } from 'react'
import AirtableSvg from '@/assets/mcp-icons/airtable.svg'
import AsanaSvg from '@/assets/mcp-icons/asana.svg'
import BoxSvg from '@/assets/mcp-icons/box.svg'
import BraveSearchSvg from '@/assets/mcp-icons/brave_search.svg'
import CalComSvg from '@/assets/mcp-icons/cal_com.svg'
import CanvaSvg from '@/assets/mcp-icons/canva.svg'
import ClickUpSvg from '@/assets/mcp-icons/clickup.svg'
import CloudflareSvg from '@/assets/mcp-icons/cloudflare.svg'
import ConfluenceSvg from '@/assets/mcp-icons/confluence.svg'
import DiscordSvg from '@/assets/mcp-icons/discord.svg'
import DropboxSvg from '@/assets/mcp-icons/dropbox.svg'
import ExaPng from '@/assets/mcp-icons/exa.png'
import FigmaSvg from '@/assets/mcp-icons/figma.svg'
import GithubSvg from '@/assets/mcp-icons/github.svg'
import GitlabSvg from '@/assets/mcp-icons/gitlab.svg'
@@ -11,13 +20,32 @@ import GoogleSvg from '@/assets/mcp-icons/google.svg'
import GoogleCalendarSvg from '@/assets/mcp-icons/google_calendar.svg'
import GoogleDocsSvg from '@/assets/mcp-icons/google_docs_editors.svg'
import GoogleDriveSvg from '@/assets/mcp-icons/google_drive.svg'
import GoogleFormsSvg from '@/assets/mcp-icons/google_forms.svg'
import HubSpotSvg from '@/assets/mcp-icons/hubspot.svg'
import IntercomSvg from '@/assets/mcp-icons/intercom.svg'
import JiraSvg from '@/assets/mcp-icons/jira.svg'
import LinearSvg from '@/assets/mcp-icons/linear.svg'
import LinkedinSvg from '@/assets/mcp-icons/linkedin.svg'
import Mem0Webp from '@/assets/mcp-icons/memo.webp'
import MicrosoftTeamsSvg from '@/assets/mcp-icons/microsoft_teams.svg'
import MixpanelSvg from '@/assets/mcp-icons/mixpanel.svg'
import MondaySvg from '@/assets/mcp-icons/monday.svg'
import NotionSvg from '@/assets/mcp-icons/notion.svg'
import OneDriveSvg from '@/assets/mcp-icons/onedrive.svg'
import OutlookSvg from '@/assets/mcp-icons/outlook.svg'
import PostHogSvg from '@/assets/mcp-icons/posthog.svg'
import PostmanSvg from '@/assets/mcp-icons/postman.svg'
import ResendSvg from '@/assets/mcp-icons/resend.svg'
import SalesforceSvg from '@/assets/mcp-icons/salesforce.svg'
import ShopifySvg from '@/assets/mcp-icons/shopify.svg'
import SlackSvg from '@/assets/mcp-icons/slack.svg'
import StripeSvg from '@/assets/mcp-icons/stripe.svg'
import SupabaseSvg from '@/assets/mcp-icons/supabase.svg'
import VercelSvg from '@/assets/mcp-icons/vercel.svg'
import WhatsAppWebp from '@/assets/mcp-icons/whatsapp.webp'
import WordPressSvg from '@/assets/mcp-icons/wordpress.svg'
import YouTubeSvg from '@/assets/mcp-icons/youtube.svg'
import ZendeskSvg from '@/assets/mcp-icons/zendesk.svg'
const mcpIconMap: Record<string, string> = {
Gmail: GmailSvg,
@@ -25,6 +53,7 @@ const mcpIconMap: Record<string, string> = {
'Google Docs': GoogleDocsSvg,
'Google Drive': GoogleDriveSvg,
'Google Sheets': GoogleSvg,
'Google Forms': GoogleFormsSvg,
Slack: SlackSvg,
LinkedIn: LinkedinSvg,
Notion: NotionSvg,
@@ -37,7 +66,35 @@ const mcpIconMap: Record<string, string> = {
Figma: FigmaSvg,
Canva: CanvaSvg,
Salesforce: SalesforceSvg,
ClickUp: ClickUpSvg,
Asana: AsanaSvg,
Monday: MondaySvg,
'Microsoft Teams': MicrosoftTeamsSvg,
'Outlook Mail': OutlookSvg,
'Outlook Calendar': OutlookSvg,
Supabase: SupabaseSvg,
Vercel: VercelSvg,
Postman: PostmanSvg,
Stripe: StripeSvg,
Cloudflare: CloudflareSvg,
'Brave Search': BraveSearchSvg,
Mem0: Mem0Webp,
Exa: ExaPng,
Dropbox: DropboxSvg,
OneDrive: OneDriveSvg,
WordPress: WordPressSvg,
YouTube: YouTubeSvg,
Box: BoxSvg,
HubSpot: HubSpotSvg,
PostHog: PostHogSvg,
Mixpanel: MixpanelSvg,
Discord: DiscordSvg,
WhatsApp: WhatsAppWebp,
Shopify: ShopifySvg,
'Cal.com': CalComSvg,
Resend: ResendSvg,
Zendesk: ZendeskSvg,
Intercom: IntercomSvg,
}
interface McpServerIconProps {

View File

@@ -3,6 +3,9 @@
* Copyright 2025 BrowserOS
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { OAUTH_MCP_SERVERS } from '../lib/clients/klavis/oauth-mcp-servers'
/**
* BrowserOS Agent System Prompt v5
*
@@ -251,10 +254,13 @@ Use \`browser_get_bookmarks\` to find existing folder IDs, or create new folders
// -----------------------------------------------------------------------------
function getExternalIntegrations(): string {
const serverNames = OAUTH_MCP_SERVERS.map((s) => s.name).join(', ')
const serverCount = OAUTH_MCP_SERVERS.length
return `<external_integrations>
## External Integrations (Klavis Strata)
You have access to 15+ external services, including Gmail, Slack, Google Calendar, Notion, GitHub, and Jira, via Strata tools. Use progressive discovery.
You have access to ${serverCount}+ external services (Gmail, Slack, Google Calendar, Notion, GitHub, Jira, etc.) via Strata tools. Use progressive discovery.
<discovery_flow>
1. \`discover_server_categories_or_actions(user_query, server_names[])\` - **Start here**. Returns categories or actions for specified servers.
@@ -281,7 +287,7 @@ When \`execute_action\` fails with an authentication error:
</critical_rule>
## Available Servers
Gmail, Google Calendar, Google Docs, Google Sheets, Google Drive, Slack, LinkedIn, Notion, Airtable, Confluence, GitHub, GitLab, Linear, Jira, Figma, Canva, Salesforce.
${serverNames}.
## Usage Guidelines
- Always discover before executing, do not guess action names

View File

@@ -19,6 +19,29 @@ interface KlavisRouteDeps {
browserosId: string
}
const normalizeServerKey = (value: string): string =>
value.toLowerCase().replace(/[^a-z0-9]+/g, '')
const getAuthUrlForServer = (
authUrlMap: Record<string, string> | undefined,
serverName: string,
): string | undefined => {
if (!authUrlMap) {
return undefined
}
const directMatch = authUrlMap[serverName]
if (directMatch) {
return directMatch
}
const targetKey = normalizeServerKey(serverName)
for (const [key, value] of Object.entries(authUrlMap)) {
if (normalizeServerKey(key) === targetKey) {
return value
}
}
return undefined
}
export function createKlavisRoutes(deps: KlavisRouteDeps) {
const { browserosId } = deps
const klavisClient = new KlavisClient()
@@ -67,11 +90,18 @@ export function createKlavisRoutes(deps: KlavisRouteDeps) {
try {
const integrations = await klavisClient.getUserIntegrations(browserosId)
const normalizedIntegrations = integrations.map((integration) => ({
name: integration.name,
is_authenticated: integration.isAuthenticated,
}))
logger.info('Fetched user integrations', {
browserosId: browserosId.slice(0, 12),
count: integrations.length,
count: normalizedIntegrations.length,
})
return c.json({
integrations: normalizedIntegrations,
count: normalizedIntegrations.length,
})
return c.json({ integrations, count: integrations.length })
} catch (error) {
logger.error('Error fetching user integrations', {
browserosId: browserosId?.slice(0, 12),
@@ -101,8 +131,8 @@ export function createKlavisRoutes(deps: KlavisRouteDeps) {
serverName,
strataId: result.strataId,
addedServers: result.addedServers,
oauthUrl: result.oauthUrls?.[serverName],
apiKeyUrl: result.apiKeyUrls?.[serverName],
oauthUrl: getAuthUrlForServer(result.oauthUrls, serverName),
apiKeyUrl: getAuthUrlForServer(result.apiKeyUrls, serverName),
})
})
.post(

View File

@@ -15,6 +15,19 @@ export interface StrataCreateResponse {
apiKeyUrls?: Record<string, string>
}
interface KlavisIntegrationObject {
name?: string
isAuthenticated?: boolean
is_authenticated?: boolean
}
type KlavisIntegrationItem = string | KlavisIntegrationObject
export interface UserIntegration {
name: string
isAuthenticated: boolean
}
export class KlavisClient {
private baseUrl: string
@@ -81,19 +94,42 @@ export class KlavisClient {
/**
* Get user integrations with authentication status
*/
async getUserIntegrations(
userId: string,
): Promise<Array<{ name: string; isAuthenticated: boolean }>> {
async getUserIntegrations(userId: string): Promise<UserIntegration[]> {
const data = await this.request<{
integrations: Array<{ name: string; isAuthenticated: boolean }>
integrations?: KlavisIntegrationItem[]
}>('GET', `/user/${userId}/integrations`)
return data.integrations || []
const integrations = Array.isArray(data.integrations)
? data.integrations
: []
return integrations
.map((integration) => this.normalizeIntegration(integration))
.filter((integration): integration is UserIntegration =>
Boolean(integration),
)
}
private normalizeIntegration(
integration: KlavisIntegrationItem,
): UserIntegration | null {
if (typeof integration === 'string') {
return { name: integration, isAuthenticated: true }
}
const name = integration.name
if (!name || typeof name !== 'string') {
return null
}
const isAuthenticated =
typeof integration.isAuthenticated === 'boolean'
? integration.isAuthenticated
: typeof integration.is_authenticated === 'boolean'
? integration.is_authenticated
: false
return { name, isAuthenticated }
}
/**
* Submit an API key to Klavis's set-auth endpoint via the proxy.
* Extracts instanceId from the apiKeyUrl and routes through the proxy.
* Docs: POST /mcp-server/instance/set-auth with { instanceId, authData }
*/
async submitApiKey(apiKeyUrl: string, apiKey: string): Promise<void> {
const parsedUrl = new URL(apiKeyUrl)
@@ -102,15 +138,11 @@ export class KlavisClient {
throw new Error('Missing instance_id in apiKeyUrl')
}
const data = await this.request<{ success: boolean; message?: string }>(
'POST',
'/mcp-server/instance/set-auth',
{ instanceId, authData: { api_key: apiKey } },
)
if (!data.success) {
throw new Error(data.message || 'Klavis API key submission failed')
}
// request() already throws on non-2xx responses
await this.request('POST', '/mcp-server/instance/set-auth', {
instanceId,
authData: { api_key: apiKey },
})
}
/**

View File

@@ -30,5 +30,34 @@ export const OAUTH_MCP_SERVERS: OAuthMcpServer[] = [
{ name: 'Figma', description: 'Access and manage design files' },
{ name: 'Canva', description: 'Create and manage designs' },
{ name: 'Salesforce', description: 'Manage leads, contacts, opportunities' },
{ name: 'ClickUp', description: 'Manage tasks, projects, and workflows' },
{ name: 'Asana', description: 'Organize and track team projects' },
{ name: 'Monday', description: 'Manage work and team collaboration' },
{ name: 'Microsoft Teams', description: 'Chat, meet, and collaborate' },
{ name: 'Outlook Mail', description: 'Send, read, and manage emails' },
{ name: 'Outlook Calendar', description: 'Schedule meetings and events' },
{ name: 'Supabase', description: 'Manage databases and backend services' },
{ name: 'Vercel', description: 'Deploy and manage web applications' },
{ name: 'Postman', description: 'Test and manage APIs' },
{ name: 'Stripe', description: 'Manage payments and subscriptions' },
{ name: 'Cloudflare', description: 'Manage domains, DNS, and security' },
{ name: 'Brave Search', description: 'Search the web privately' },
{ name: 'Mem0', description: 'Store and retrieve AI memory' },
{ name: 'Exa', description: 'AI-powered semantic web search' },
{ name: 'Dropbox', description: 'Store and share files in the cloud' },
{ name: 'OneDrive', description: 'Store and sync files with Microsoft' },
{ name: 'WordPress', description: 'Manage websites and blog content' },
{ name: 'YouTube', description: 'Access video info and transcripts' },
{ name: 'Box', description: 'Manage and share enterprise files' },
{ name: 'HubSpot', description: 'Manage contacts, deals, and marketing' },
{ name: 'PostHog', description: 'Query analytics, manage feature flags' },
{ name: 'Mixpanel', description: 'Analyze user behavior and metrics' },
{ name: 'Discord', description: 'Send messages and manage servers' },
{ name: 'WhatsApp', description: 'Send messages and manage conversations' },
{ name: 'Shopify', description: 'Manage products, orders, and store' },
{ name: 'Cal.com', description: 'Schedule meetings and manage availability' },
{ name: 'Resend', description: 'Send transactional and marketing emails' },
{ name: 'Google Forms', description: 'Create and manage forms and surveys' },
{ name: 'Zendesk', description: 'Manage support tickets and customers' },
{ name: 'Intercom', description: 'Manage customer messaging and support' },
]

View File

@@ -0,0 +1,92 @@
/**
* @license
* Copyright 2025 BrowserOS
*/
import { afterEach, describe, it } from 'bun:test'
import assert from 'node:assert'
import { createKlavisRoutes } from '../../../src/api/routes/klavis'
const originalFetch = globalThis.fetch
afterEach(() => {
globalThis.fetch = originalFetch
})
describe('createKlavisRoutes', () => {
it('normalizes string integrations into authenticated entries', async () => {
globalThis.fetch = (async () =>
Response.json({
integrations: ['Google Docs', 'Slack'],
})) as typeof fetch
const route = createKlavisRoutes({ browserosId: 'user-123' })
const response = await route.request('/user-integrations')
const body = await response.json()
assert.strictEqual(response.status, 200)
assert.deepStrictEqual(body, {
integrations: [
{ name: 'Google Docs', is_authenticated: true },
{ name: 'Slack', is_authenticated: true },
],
count: 2,
})
})
it('supports object integrations with mixed auth flag formats', async () => {
globalThis.fetch = (async () =>
Response.json({
integrations: [
{ name: 'Google Docs', isAuthenticated: false },
{ name: 'Slack', is_authenticated: true },
],
})) as typeof fetch
const route = createKlavisRoutes({ browserosId: 'user-123' })
const response = await route.request('/user-integrations')
const body = await response.json()
assert.strictEqual(response.status, 200)
assert.deepStrictEqual(body, {
integrations: [
{ name: 'Google Docs', is_authenticated: false },
{ name: 'Slack', is_authenticated: true },
],
count: 2,
})
})
it('resolves auth URLs with normalized server name keys', async () => {
globalThis.fetch = (async () =>
Response.json({
strataServerUrl: 'https://strata.example.com',
strataId: 'strata-123',
addedServers: ['Google Docs'],
oauthUrls: { google_docs: 'https://oauth.example.com/google-docs' },
apiKeyUrls: {
google_docs: 'https://auth.example.com/setup?instance_id=abc123',
},
})) as typeof fetch
const route = createKlavisRoutes({ browserosId: 'user-123' })
const response = await route.request('/servers/add', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ serverName: 'Google Docs' }),
})
const body = await response.json()
assert.strictEqual(response.status, 200)
assert.deepStrictEqual(body, {
success: true,
serverName: 'Google Docs',
strataId: 'strata-123',
addedServers: ['Google Docs'],
oauthUrl: 'https://oauth.example.com/google-docs',
apiKeyUrl: 'https://auth.example.com/setup?instance_id=abc123',
})
})
})